2011-11-30 140 views
1

我有ValueMember="Id"DisplayMember="Id"一個ComboBox,並要在標籤中顯示所選項目屬性Name,後ComboBox在選定的一些價值。我正在使用某種MVVM pattern。所以,我綁定SelectedId模型ItemsSourceViewModel。 (如果我把ItemsSource型號很容易 - 用setter和OnPropertyChanged(),但現在我在模型中的很多領域,其僅用於UI表示)顯示選定的組合框項目顯示名稱

我已經成功地顯示所選項目的名稱使用combobox LostFocus事件,其中我調用ViewModel方法,其中我使用LINQ獲取屬性Name(來自List, ,其中l.Id=Model.SelectedId)。

但是,有沒有更簡單的方法?

回答

1

可以直接綁定到ComboBox爲您的標籤:

 <ComboBox Name="MyCombo" ItemsSource="{Binding ComboListObjects}" SelectedItem="{Binding ComboSelection}" /> 
     <Label Content="{Binding ElementName=MyCombo, Path=SelectedValue}"/> 

然而,由於您使用的視圖模型,你應該改變了一下週圍的東西。 Combobox上沒有SelectedId,所以我假設你的意思是SelectedValue。相反,我建議在ViewModel上創建一個屬性來保存SelectedItem。我已經包含了一個樣本:

視圖模型:

public class MyViewModel : INotifyPropertyChanged 
{ 
    public List<MyObject> ComboListObjects 
    { 
     get{ 
      return new List<MyObject>(); // <-- fill this 
     } 
    } 

    private MyObject _selectedItem = null; 
    public MyObject ComboSelection 
    { 
     get { return _selectedItem; } 
     set { 
      _selectedItem = value; 
      NotifyPropertyChanged("ComboSelection"); 
     } 
    } 
} 

查看:

<ComboBox Name="MyCombo" ItemsSource="{Binding ComboListObjects}" SelectedItem="{Binding ComboSelection}" /> 
    <Label Content="{Binding ComboSelection.Id}"/> 
    <Label Content="{Binding ComboSelection.Name}"/> 
    <Label Content="{Binding ComboSelection.OtherInfo}"/> 

如果你打算使用MVVM,避免使用代碼隱藏,尤其是活動的,除非你正在寫一自定義控件。

希望幫助...

+0

我同意。 'SelectedItem'是要走的路,因爲然後他可以將任何其他字段綁定到SelectedItem(或SelectedItem上的一個屬性)。 –

+0

謝謝。但現在問題是我在模型中使用entlib驗證程序,如果我將選定的ComboBox對象綁定到ViewModel,那麼我無法在ComboBox中顯示驗證結果圖像(因爲Combobox綁定ViewModel.Object,而不是Model.SelectedObjectId) – davor

+0

,我的朋友,是一匹不同顏色的馬。您應該相應地檢查或更改驗證程序(因此它不需要該ID,但可以解析實例中的ID。 –

0

下面是如何組合框綁定到一個書單,並使用MVVM的標籤上顯示的書名的例子。


在XAML標記,使用的ItemsSource及的SelectedItem屬性

<ComboBox Name="cbBook" ItemsSource="{Binding Books}" SelectedItem="{Binding SelectedBook, Mode=TwoWay}" /> 
<Label DataContext="{Binding SelectedBook}" Content="{Binding Title}" /> 


視圖中的組合框綁定到視圖模型,設置在DataContext到您的視圖模型類

public partial class MyView : UserControl 
{ 
    public MyView() 
    { 
     InitializeComponent(); 
     DataContext = new BookViewModel(); 
    } 
} 


視圖模型應該具有您將綁定到的公共屬性。

public class BookViewModel : BaseViewModel 
{ 
    public BookViewModel() 
    { 
     Books = new ObservableCollection<Book>(); 
    } 

    public ObservableCollection<Book> Books { get; set; } 

    private Book _selectedBook; 
    public Book SelectedBook 
    { 
     get { return _selectedBook; } 
     set 
     { 
      _selectedBook = value; 
      NotifyPropertyChanged(() => SelectedBook); 
     } 
    } 
} 


該基類實現INotifyPropertyChanged接口。我爲類型安全使用了lambda表達式。

public abstract class BaseViewModel : INotifyPropertyChanged 
{ 
    protected void NotifyPropertyChanged<T>(Expression<Func<T>> expression) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(((MemberExpression)expression.Body).Member.Name)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
}