数据绑定组合框';s WinRT Prism/MVM中的SelectedValue

本文关键字:Prism MVM 中的 SelectedValue WinRT 组合 数据绑定 | 更新日期: 2024-09-19 03:52:26

我在WinRT中绑定ComboBox时遇到问题。我正在使用Prism/MVM。我能够毫无问题地将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是我的ObservableCollectionCurrentInvoice是指向当前加载的Invoice项的ViewModel上的属性。Invoice有一个名为PayeeId的属性,正如您所猜测的,它是Invoice所关联的PayeeId

出于某种原因,无论我选择哪个Invoice,当我导航到我的页面时,ComboBox都是空白的。我所说的空白只是指没有选择任何内容,但它是用Payees集合填充的。

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

以下是PayeesCurrentInvoice的属性:

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的属性,该属性绑定到ComboBoxSelectedItem属性。以下是更新后的定义:

<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保存,但当我加载页面时,它仍然不会用ComboBox中显示的SelectedPayee加载。然而,设计师一切都很好。为了进一步测试,我添加了一个绑定到SelectedPayee.Id:的TextBox

<TextBox Grid.Row="7" Grid.Column="1" Text="{Binding Path=SelectedPayee.Id}" />

它在设计时和运行时显示了正确的数字,并且每当我更改ComboBox中的选择时都会适当更新。唯一工作不正常的是,当我导航到页面时,ComboBox没有正确显示Payee AccountName。正如我所说,设计视图正确地显示了我在设计器ViewModel中的伪数据。ComboBox有什么特别之处吗?我可能按错误的顺序做了一些事情?

编辑2:

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

SelectedValue={Binding Path=SelectedPayee.Id, Mode=TwoWay}

绑定在TextBox中显示正确的Payee.Id,这取决于在ComboBox中选择了哪个Payee,但当我第一次导航到页面时,它没有显示SelectedPayee(但TextBox将填充正确的Id。)这真的让我头疼…

编辑3:

我把一切都弄清楚了。我要做的最后一个问题是,我在实际加载ComboBox之前设置了SelectedPayee,因此没有属性更改来触发ComboBoxSelectedValue更改。一旦我将呼叫转移到LoadPayees(),而不是分配到SelectedValue,一切都像一个符咒请参阅下面的答案

数据绑定组合框';s WinRT Prism/MVM中的SelectedValue

对于任何在寻找解决方案时偶然发现这个问题的人,我最终发现我在加载ComboBox之前设置了SelectedPayee。我将呼叫转移到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);
}