DataBinding WinRT Prism / MVVM中的ComboBox的SelectedValue

时间:2015-03-02 21:39:14

标签: c# mvvm combobox windows-runtime

我遇到了尝试在WinRT中绑定ComboBox的问题。我正在使用Prism / MVVM。我可以将ItemsSource绑定到ObservableCollection没问题,并且正在填充ComboBox

我遇到的问题是,它会根据当前Invoice自动选择合适的值。这是相关的XAML:

<ComboBox Grid.Row="0" Grid.Column="1" Height="30" 
          ItemsSource="{Binding Path=Payees}"
          DisplayMemberPath="AccountName"
          SelectedValuePath="PayeeId"
          SelectedValue="{Binding CurrentInvoice.PayeeId, Mode=TwoWay}"
          Margin="5,0,10,0" />

Payees是我的ObservableCollectionCurrentInvoiceViewModel上指向当前加载的Invoice项的属性。 Invoice有一个名为PayeeId的属性,正如您所猜测的那样,Id与此Payee相关联。{/ p} >

由于某些原因,无论我选择哪个Invoice,导航到我的页面时Invoice都是空白的。通过空白,我只是说没有选择任何内容,但它填充了ComboBox集合。

如果我手动更改选择并保存Payees,则Invoice不会更改。我认为它可能与PayeeId上的绑定有关,但到目前为止我一直无法弄清楚这一点。在此先感谢您的帮助!

以下是SelectedValuePayees

的属性
CurrentInvoice

修改

我在名为private Invoice _currentInvoice; public Invoice CurrentInvoice { get { return _currentInvoice; } set { SetProperty(ref _currentInvoice, value); } } private ObservableCollection<Payee> _payees; public ObservableCollection<Payee> Payees { get { return _payees; } set { SetProperty(ref _payees, value); } } 的{​​{1}}上添加了一个属性,该属性绑定到ViewModel的{​​{1}}属性。这是更新的定义:

SelectedPayee

当我选择SelectedItem并保存时,它会使用新的ComboBox保存,但是当我加载页面时,它仍然无法加载<ComboBox Grid.Row="0" Grid.Column="1" Height="30" ItemsSource="{Binding Path=Payees}" DisplayMemberPath="AccountName" SelectedValuePath="Id" SelectedItem="{Binding Path=SelectedPayee, Mode=TwoWay}" Margin="5,0,10,0" /> 中显示的Payee }}。然而,设计师的一切都很好。为了进一步测试,我添加了一个绑定到PayeeId的{​​{1}}:

SelectedPayee

在设计时和运行时显示正确的数字,并且每当我更改ComboBox中的选择时,都会相应更新。唯一不能正常工作的是当我导航到该页面时TextBox未正确显示SelectedPayee.Id <TextBox Grid.Row="7" Grid.Column="1" Text="{Binding Path=SelectedPayee.Id}" /> 。正如我所说,设计视图正确显示我在设计器ComboBox中的虚拟数据。 ComboBox有什么特别之处,我可能会以错误的顺序做某事吗?

编辑2:

我也使用

获得完全相同的结果
Payee

绑定在AccountName中显示正确的ViewModel,具体取决于ComboBox中选择的SelectedValue={Binding Path=SelectedPayee.Id, Mode=TwoWay} ,但它不会显示Payee.Id当我第一次导航到页面时(TextBox将填充正确的Payee。)这对我来说真是个蠢货......

编辑3:

我把它全部拉直了。我最后一个问题是我在实际加载ComboBox之前设置了SelectedPayee,因此没有属性更改来触发TextBox的{​​{1}}更改。一旦我将调用移至Id以上的SelectedPayee,一切就像魅力一样。 请参阅下面的答案。

1 个答案:

答案 0 :(得分:0)

对于任何偶然发现此问题寻找解决方案的人,我最终发现的是我在加载SelectedPayee之前设置了ComboBox 。我将调用移至LoadPayees()以上SelectedPayee任务,现在一切正常!对于任何感兴趣的人,这是我的OnNavigatedTo()方法:

public override async void OnNavigatedTo(object navigationParameter, NavigationMode navigationMode,
    Dictionary<string, object> viewModelState)
{
    _headerViewModel.PageTitle = "Invoice Details";

    await LoadPayees();
    if (navigationParameter is Invoice)
    {
        _isEditing = true;
        CurrentInvoice = navigationParameter as Invoice;

        var payee = await _payeesRepository.LoadByIdAsync(CurrentInvoice.PayeeId);
        SelectedPayee = payee;

        await LoadPayments();
    }
    else
    {
        CurrentInvoice = new Invoice
        {
            CreationDate = DateTime.Now,
            InvoiceDate = DateTime.Now,
            Frequency = "M"
        };
    }
    /* await LoadPayees(); was originally down here... oops! */

    base.OnNavigatedTo(navigationParameter, navigationMode, viewModelState);
}