2017-11-16 4 views
0

UWP 앱을 개발 중이며 문제가 있습니다. 앱은 Template10과 함께 MVVM 패턴을 사용합니다. 내가 겪고있는 문제를 재현하는 비슷한 solution을 만들었습니다. 이 솔루션에서는 주문 목록이 표시되고 사용자는 주문을 선택한 다음 "편집"단추를 클릭합니다. 그런 다음 두 번째 페이지가 표시되고 이전에 선택한 주문이 미리로드되며 두 번째 페이지에서는 사용자가 주문을 편집 할 수 있습니다. 두 번째 페이지에 문제가 있습니다. 콤보 상자에 바인딩 된 데이터가 표시되지 않습니다. 아마도이 문제는이 question과 관련이 있습니다. 필자의 경우 SelectedValue는 ItemsSource 앞에 설정됩니다. 디버깅 후, 나는 OrderEditionPage.g.cs에서 코드 줄에 도달했습니다 : UWP - 사용할 때 업데이트 순서를 지정하는 방법 x : Bind?

private void Update_ViewModel(global::ComboApp.ViewModels.OrderEditionPageViewModel obj, int phase) 
{ 
    this.bindingsTracking.UpdateChildListeners_ViewModel(obj); 
    if (obj != null) 
    { 
     if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) 
     { 
      this.Update_ViewModel_SelectedOrder(obj.SelectedOrder, phase); 
     } 
     if ((phase & (NOT_PHASED | (1 << 0))) != 0) 
     { 
      this.Update_ViewModel_BusinessAssociates(obj.BusinessAssociates, phase); 
      this.Update_ViewModel_TransactionTypes(obj.TransactionTypes, phase); 
      this.Update_ViewModel_OrderTypes(obj.OrderTypes, phase); 
      this.Update_ViewModel_ShowSelectedOrder(obj.ShowSelectedOrder, phase); 
     } 
    } 
} 

내가 코드 줄을 달성 할 수 있다면

마지막에 실행, 내 문제가 해결 될 것입니다 : this.Update_ViewModel_SelectedOrder (OBJ. SelectedOrder, phase);

어떻게하면됩니까? Visual Studio는이 줄의 순서를 어떻게 결정합니까?

OrderEditionPage.xaml

<Page 
    x:Class="ComboApp.Views.OrderEditionPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:myconverters="using:ComboApp.Converters" 
    xmlns:t10converters="using:Template10.Converters" 
    mc:Ignorable="d"> 

    <Page.Resources> 
     <t10converters:ChangeTypeConverter x:Key="TypeConverter" /> 
     <myconverters:DateTimeConverter x:Key="DateTimeConverter" /> 
    </Page.Resources> 

    <ScrollViewer VerticalScrollBarVisibility="Auto"> 
     <StackPanel 
      Padding="15, 5" 
      Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
      <TextBox 
       Header="Order #" 
       Margin="5" 
       Width="150" 
       HorizontalAlignment="Left" 
       Text="{x:Bind ViewModel.SelectedOrder.ExternalId, Mode=TwoWay}" /> 
      <ComboBox 
       Header="Business Associate" 
       Margin="5" 
       MinWidth="300" 
       SelectedValuePath="BusinessAssociateId" 
       DisplayMemberPath="Name1" 
       ItemsSource="{x:Bind ViewModel.BusinessAssociates}" 
       SelectedValue="{x:Bind ViewModel.SelectedOrder.BusinessAssociateId, Mode=TwoWay, Converter={StaticResource TypeConverter}}" /> 
      <DatePicker 
       Header="Delivery Date" 
       Margin="5" 
       MinWidth="0" 
       Width="200" 
       Date="{x:Bind ViewModel.SelectedOrder.DeliveryDate, Mode=TwoWay, Converter={StaticResource DateTimeConverter}}" /> 
      <ComboBox 
       Header="Transaction" 
       MinWidth="200" 
       Margin="5" 
       SelectedValuePath="Value" 
       DisplayMemberPath="Display" 
       ItemsSource="{x:Bind ViewModel.TransactionTypes}" 
       SelectedValue="{x:Bind ViewModel.SelectedOrder.TransactionType, Mode=TwoWay}" /> 
      <TextBox 
       Header="Priority" 
       Margin="5" 
       MaxWidth="150" 
       HorizontalAlignment="Left" 
       Text="{x:Bind ViewModel.SelectedOrder.Priority}" /> 
      <ComboBox 
       Header="Type" 
       Margin="5" 
       MinWidth="200" 
       SelectedValuePath="Value" 
       DisplayMemberPath="Display" 
       ItemsSource="{x:Bind ViewModel.OrderTypes}" 
       SelectedValue="{x:Bind ViewModel.SelectedOrder.OrderType, Mode=TwoWay}" /> 
      <TextBox 
       Header="Information" 
       Margin="5" 
       Height="100" 
       AcceptsReturn="True" 
       TextWrapping="Wrap" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       Text="{x:Bind ViewModel.SelectedOrder.Information, Mode=TwoWay}" /> 
      <Button 
       Margin="5" 
       Content="Show" 
       Width="100" 
       HorizontalAlignment="Right" 
       Command="{x:Bind ViewModel.ShowSelectedOrder}" /> 
     </StackPanel> 
    </ScrollViewer> 
</Page> 

OrderEditionPage.xaml.cs

using ComboApp.ViewModels; 
using Windows.UI.Xaml.Controls; 

namespace ComboApp.Views 
{ 
    public sealed partial class OrderEditionPage : Page 
    { 
     public OrderEditionPageViewModel ViewModel => DataContext as OrderEditionPageViewModel; 

     public OrderEditionPage() 
     { 
      this.InitializeComponent(); 
     } 
    } 
} 

OrderEditionPageViewModel.cs

using ComboApp.Models; 
using ComboApp.Services; 
using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Threading.Tasks; 
using Template10.Mvvm; 
using Template10.Utils; 
using Windows.UI.Xaml.Navigation; 

namespace ComboApp.ViewModels 
{ 
    public class OrderEditionPageViewModel 
     : ViewModelBase 
    { 
     private IBusinessAssociateService businessAssociateService; 

     private Order selectedOrder; 
     public Order SelectedOrder 
     { 
      get { return selectedOrder; } 
      set { Set(ref selectedOrder, value); } 
     } 

     public ObservableCollection<object> TransactionTypes { get; set; } = new ObservableCollection<object>(); 
     public ObservableCollection<object> OrderTypes { get; set; } = new ObservableCollection<object>(); 
     public ObservableCollection<BusinessAssociate> BusinessAssociates { get; set; } = new ObservableCollection<BusinessAssociate>(); 

     public OrderEditionPageViewModel(IBusinessAssociateService businessAssociateService) 
     { 
      this.businessAssociateService = businessAssociateService; 

      TransactionTypes.Add(new { Value = "I", Display = "Incoming" }); 
      TransactionTypes.Add(new { Value = "O", Display = "Outgoing" }); 
      TransactionTypes.Add(new { Value = "T", Display = "Transfer" }); 

      OrderTypes.Add(new { Value = "M", Display = "Manual" }); 
      OrderTypes.Add(new { Value = "A", Display = "Automatic" }); 
      OrderTypes.Add(new { Value = "S", Display = "Semi-automatic" }); 
     } 

     public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state) 
     { 
      // Loading buiness associates 
      var response = await businessAssociateService.GetNextPageAsync(); 
      if (response.IsSuccessful) 
      { 
       BusinessAssociates.AddRange(response.Result.Items); 
      } 

      SelectedOrder = (Order)parameter; 
      await base.OnNavigatedToAsync(parameter, mode, state); 
     } 

     private DelegateCommand showSelectedOrder; 
     public DelegateCommand ShowSelectedOrder => showSelectedOrder ?? (showSelectedOrder = new DelegateCommand(async() => 
     { 
      await Views.MessageBox.ShowAsync(JsonConvert.SerializeObject(SelectedOrder, Formatting.Indented)); 
     })); 

    } 
} 

답변

0

ComboBoxSelectedValue이 때때로 ItemsSource 전에 설정되는 경우 알려진 이슈는 x:Bind이며, 이에 대한 자세한 내용은 here을 참조하십시오.

x:Bind 대신 Bindings을 사용할 수 있지만 XAML에서 SelectedValue 바인딩 전에 ItemsSource 바인딩이 있는지 확인하십시오.

두 번째 페이지의 Page_Loaded 이벤트에서 Bindings.Update()을 호출 해보십시오.

+0

x : Bind 대신 Binding을 사용하여 두 가지 해결책을 모두 시도해 보았습니다. Bindings.Update() 제안이 작동하지 않았습니다. – Wacho