我遇到了尝试在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
是我的ObservableCollection
,CurrentInvoice
是ViewModel
上指向当前加载的Invoice
项的属性。 Invoice
有一个名为PayeeId
的属性,正如您所猜测的那样,Id
与此Payee
相关联。{/ p} >
由于某些原因,无论我选择哪个Invoice
,导航到我的页面时Invoice
都是空白的。通过空白,我只是说没有选择任何内容,但它填充了ComboBox
集合。
如果我手动更改选择并保存Payees
,则Invoice
不会更改。我认为它可能与PayeeId
上的绑定有关,但到目前为止我一直无法弄清楚这一点。在此先感谢您的帮助!
以下是SelectedValue
和Payees
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
,一切就像魅力一样。 请参阅下面的答案。
答案 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);
}