C# 在WinRT Prism/MVVM中数据绑定组合框的SelectedValue

C# 在WinRT Prism/MVVM中数据绑定组合框的SelectedValue,c#,mvvm,combobox,windows-runtime,C#,Mvvm,Combobox,Windows Runtime,我在WinRT中绑定组合框时遇到问题。我正在使用Prism/MVVM。我可以将ItemsSource绑定到一个ObservableCollection,没有问题,并且正在填充组合框 我遇到的问题是,让它根据当前发票自动选择适当的值。以下是相关的XAML: <ComboBox Grid.Row="0" Grid.Column="1" Height="30" ItemsSource="{Binding Path=Payees}" DisplayMemb

我在WinRT中绑定组合框时遇到问题。我正在使用Prism/MVVM。我可以将ItemsSource绑定到一个ObservableCollection,没有问题,并且正在填充组合框

我遇到的问题是,让它根据当前发票自动选择适当的值。以下是相关的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" />
编辑:

我在ViewModel上添加了一个名为SelectedPaye的属性,该属性绑定到ComboBox的SelectedItem属性。以下是更新后的定义:

<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" />
它在设计时和运行时显示了正确的数字,并且在我更改组合框中的选择时会相应地更新。唯一不能正常工作的是,当我导航到页面时,组合框没有正确显示收款人帐户名。正如我所说,design视图正确地显示了designer ViewModel中的虚拟数据。组合框有什么特别的地方吗?我可能是按错误的顺序做了什么

编辑2:

我也得到了完全相同的结果使用

SelectedValue={Binding Path=SelectedPayee.Id, Mode=TwoWay}
绑定在文本框中显示正确的受款人.Id,这取决于在组合框中选择的受款人,但当我第一次导航到页面时,它不会显示所选的受款人,但文本框将填充正确的Id。这对我来说真是一个难题

编辑3:


我把一切都弄清楚了。我遇到的最后一个问题是,我在实际加载组合框之前设置了SelectedPaye,因此没有属性更改来触发组合框的SelectedValue更改。一旦我将对LoadPayes的呼叫移到分配上方的SelectedValue,一切都会像一个符咒一样工作。请参阅下面的答案。

对于那些偶然发现这个问题并寻求解决方案的人,我最终发现我在加载组合框之前设置了SelectedPaye。我将呼叫LoadPayes移动到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);
}

我不知道这个组件是如何工作的,但通常在组合框中选择的是索引,而不是具体的值。此外,如果您尝试将selectedValue硬编码到combobox中,它是否能按预期工作?combobox上有SelectedIndex和selectedValue属性。SelectedValue应该是XAML中显示的PayeId,而不是项的索引。嗯,SelectedValue={Binding Path=CurrentInvoice.PayeId,Mode=TwoWay}怎么样?我会尝试删除SelectedValue和SelectedValuePath的用法,而改为使用SelectedItem。@libik我不确定最后一条评论SelectedValue=。。。,这就是我已经知道的,路径=是隐含的。我两种方法都试过了,结果都一样。
SelectedValue={Binding Path=SelectedPayee.Id, Mode=TwoWay}
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);
}