2014-05-13 50 views
3

我有兩個對象:UserDto和RoleDto。用戶有一個屬性是RoleDto。 在我的視圖模型我有以下幾點:Wpf組合框選定項目不起作用

public UserDto User 
    { 
     get { return _user; } 
     set 
     { 
      if (_user == value) return; 

      _user = value; 
      User.PropertyChanged += UserPropertyChanged; 
      OnPropertyChanged("User"); 
     } 
    } 
    private UserDto _user; 

public IEnumerable<RoleDto> Roles { get; set; } //I load all available roles in here 

在視圖中,我希望用戶所屬選擇角色。這是我如何定義組合框在視圖:

<ComboBox Grid.Row="3" Grid.Column="1" Margin="5" ItemsSource="{Binding Roles}" SelectedItem="{Binding User.Role, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Description" /> 

如果我嘗試創建一個新用戶,並從組合框的作用,它被正確綁定到用戶。問題是,當我加載一個已經存在的用戶時,該角色不會顯示在組合框中(即使用戶定義了一個角色)。

請幫忙嗎?

在此先感謝

+0

我推斷,當你(userdto)用戶有數據或沒有你的組合框綁定到角色。您必須分配組合框selectedItem。 – Eldho

回答

5

這是因爲你的UserDTO有,不符合任何RoleDTOsRoles收集您設定的ComboBoxItemsSourceRoleDTO參考。

更好地定義你的視圖模型的屬性一樣

public RoleDTO SelectedRole 
    { 
     get { return Roles.FirstOrDefault(role => role.Role == User.RoleDto.Role); } 
     set { User.RoleDto = value; OnPropertyChanged("SelectedRole"); } 
    } 

並將其設置爲的SelectedItem的組合框你

ItemsSource="{Binding Roles}" SelectedItem="{Binding SelectedRole, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Description" /> 
0

另一種方式來解決這個問題是在使用BindingConverter。當您使用綁定來綁定SelectedItem時,WPF將檢查SelectedItemItemsSource屬性內的所有對象的引用,當然如果沒有匹配,則SelectedItem將爲空。使用Converter你可以告訴WPF它應該如何匹配SelectedItem
在這種情況下,您只需在ItemsSource中找到SelectedItem並將其返回至Binding。所以請按照下列步驟操作:
1-創建一個類並執行IValueConverter。它有兩個方法:ConvertConvertBack
2-爲Convert方法做這樣的事情:

public class MySelecteItemBindingConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     var mySelectedItem = value as MySelectedItemType; 
     var myItemsSource = parameter as List<MySelectedItemType>; 
     var matchedItem = myItemsSource.FirstOrDefault(i=>i.Id == mySelectedItem.Id); 
     return matchedItem; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Do just like Convert method 
    } 
} 

3-使用此ConverterBinding是這樣的:如果:

var myBinding = new Binding("YourBindingPath"); 
myBinding.Converter = new MySelectedItemBindingConverter(); 
myBinding.ConverterParameter = myItemsSource; //this is List<MySelectedItemType> in this example 
myCombo.SetBinding(ComboBox.SelectedItemProperty, myBinding); 

注意你想要從XAML做綁定你不能通過ConverterParameter這樣,而應該創建一個static列表並使用它作爲ItemsSource或使用MultiBinding通過您的ConverterParameter使用技巧。這裏有一個很好的和簡單的解釋:Binding ConverterParameter

+0

爲什麼要投票?如果你有真正的理由放棄投票,請分享它。 TNX –

相關問題