2015-03-02 71 views
1

的SelectedValue我有試圖綁定在一個WinRT中的ComboBox問題。我正在使用Prism/MVVM。我能夠在ItemsSourceObservableCollection綁定沒有問題,並且正在填充ComboBox數據綁定組合框在WinRT的棱鏡/ MVVM

我無法用什麼,是有自動選擇基於當前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屬性,正如你可能已經猜到,是PayeeId,這Invoice關聯到。

由於某種原因,無論我選擇哪個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); } 
} 

編輯:

我加入了名爲SelectedPayeeViewModel綁定到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.IdTextBox

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

這顯示在設計時和運行時正確的號碼,每當我更改ComboBox選擇適當更新。這不能正常工作的唯一的事情就是ComboBox顯示不正確的PayeeAccountName當我瀏覽的網頁。正如我所說的,設計視圖正確顯示了我在設計師ViewModel中的虛擬數據。對於ComboBox有什麼特別之處,我可能是按錯誤的順序做了些什麼?

編輯2:

我也正在逐漸使用

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

完全相同的結果的結合正在顯示在TextBox正確Payee.Id取決於哪個PayeeComboBox被選擇,但它只是在我第一次導航到頁面時不顯示SelectedPayee(但TextBox將填充正確的Id。)這實際上是一個頭部劃痕她給我....

編輯3:

我把一切都理順了。最後一個問題是我在設置SelectedPayee之前實際加載了ComboBox,因此沒有屬性更改來觸發ComboBoxSelectedValue發生更改。一旦我將呼叫轉移到LoadPayees()以上的任務SelectedValue,一切都像一個魅力。 請參閱下面的答案。

+0

我不知道這個組件到底如何工作的,但通常在組合框中選擇指指數,而不是具體值。此外,如果您嘗試將selectedValue硬編碼到組合框中,它是否按預期工作? – libik 2015-03-02 21:42:52

+0

在ComboBox上有'SelectedIndex'和'SelectedValue'屬性。 「SelectedValue」應該是XAML中顯示的「PayeeId」,而不是項目的索引。 – 2015-03-02 21:47:13

+0

嗯,'SelectedValue =「{綁定路徑= CurrentInvoice.PayeeId,Mode = TwoWay}」' – libik 2015-03-02 21:51:26

回答

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); 
}