C# 在WinRT Prism/MVVM中数据绑定组合框的SelectedValue
我在WinRT中绑定组合框时遇到问题。我正在使用Prism/MVVM。我可以将ItemsSource绑定到一个ObservableCollection,没有问题,并且正在填充组合框 我遇到的问题是,让它根据当前发票自动选择适当的值。以下是相关的XAML: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
<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);
}