2014-05-13 3 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) 사용자가 데이터를 가지고 있거나 콤보 상자가 역할에 바인딩되지 않은 경우 내가 추론하는 내용. 당신은 combobox selectedItem을 할당해야합니다. – Eldho

답변

5

이것은에서

감사 때문에 당신의 UserDTO, 당신은 ComboBoxItemsSource로 설정 RoleDTOsRoles에서 수집 일치하지 않는 한 RoleDTO의 참조입니다.

더 나은

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

같이 당신의 ViewModel의 속성을 정의하고 BindingConverter을 사용

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

이 문제를 해결하는 다른 방법을 콤보 상자의 selectedItem로 설정합니다. 바인딩을 사용하여 SelectedItem을 바인딩하면 WPF는 ItemsSource 속성의 모든 객체에 대해 SelectedItem의 참조를 확인합니다. 물론 일치 항목이없는 경우 SelectedItem은 비어 있습니다. Converter을 사용하면 WPF에게 일치하는 방법을 알려줄 수 있습니다. SelectedItem.
이 경우 ItemsSource에서 SelectedItem을 찾아 Binding으로 돌려 보내면됩니다. 다음 단계를 따르십시오.
1- 클래스를 만들고 IValueConverter을 구현하십시오. 그것은 두 가지 방법이 있습니다

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 사용이처럼 Binding에이 Converter : Convert 방법 ConvertConvertBack
2는이 같은 일을 할

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 목록을 만들어이를 012로 사용해야합니다.을 트릭을 사용하여 전달하려면 MultiBinding을 사용하십시오. 여기에 그것에 대한 좋은 설명이 있습니다. Binding ConverterParameter

+0

왜 아래로 투표?! 만약 당신이 진짜 이유가 아래로 투표를 넣어, 그것을 공유 할 수 있습니다. tnx –