gpt4 book ai didi

c# - 在 WinRT Prism/MVVM 中对 ComboBox 的 SelectedValue 进行数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:45:13 24 4
gpt4 key购买 nike

我在尝试绑定(bind) ComboBox 时遇到问题在 WinRT 中。我正在使用棱镜/MVVM。我可以绑定(bind) ItemsSourceObservableCollection没问题,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 的属性,您可能猜到了,它是 IdPayeeInvoice关联到。

出于某种原因,无论是哪个 Invoice我选择 ComboBox当我导航到我的页面时为空白。空白,我只是表示没有选择任何内容,但它填充了 Payees收藏。

如果我手动更改选择,并保存我的 Invoice , PayeeId没有改变。我认为这可能与 SelectedValue 上的绑定(bind)有关。 ,但到目前为止,我一直无法弄清楚这一点。提前感谢您的帮助!

以下是 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); }
}

编辑:

我在 ViewModel 上添加了一个属性调用 SelectedPayee绑定(bind)到 SelectedItem ComboBox 的属性(property).这是更新的定义:
<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 保存,但是当我加载页面时,它仍然没有加载 SelectedPayee显示在 ComboBox .但是,设计师一切都很好。为了进一步测试,我添加了 TextBox绑定(bind)到 SelectedPayee.Id :
<TextBox Grid.Row="7" Grid.Column="1" Text="{Binding Path=SelectedPayee.Id}" />

这在设计时和运行时显示了正确的数字,并且每当我更改 ComboBox 中的选择时都会适当更新.唯一不能正常工作的是 ComboBox未正确显示 Payee AccountName当我导航到页面时。正如我所说,设计 View 正确显示了我在设计器中拥有的虚拟数据 ViewModel . ComboBox 有什么特别之处吗?我可能做错了什么?

编辑 2:

我也得到了完全相同的结果
SelectedValue={Binding Path=SelectedPayee.Id, Mode=TwoWay}

绑定(bind)显示正确的 Payee.IdTextBox取决于哪个 PayeeComboBox 中选择,但它只是不显示 SelectedPayee当我第一次导航到该页面时(但 TextBox 将填充正确的 Id 。)这对我来说真是令人头疼....

编辑 3:

我把这一切都理顺了。我遇到的最后一个问题是我正在设置 SelectedPayee在实际加载 ComboBox 之前,因此没有属性更改来触发 SelectedValueComboBox改变。一旦我将电话转移到 LoadPayees()以上分配给 SelectedValue ,一切都像魅力一样。 请参阅下面的答案。

最佳答案

对于偶然发现这个问题并寻找解决方案的任何人,我最终发现我正在设置 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);
}

关于c# - 在 WinRT Prism/MVVM 中对 ComboBox 的 SelectedValue 进行数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28819915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com