2017-12-08 17 views
0

comboboxObservableCollection으로 연결하려고합니다. 그러나 이것이 작동하지 않는 것처럼 보입니다. 인터넷을 보면서 다른 방법을 시도했지만 얻을 수없는 것처럼 보입니다. 그것은 작동하는ComboBox를 ObservableCollection과 연결하기

public class UserData 
{ 
    public string Key { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string Application 
    { 
     get 
     { 
      return Text; 
     } 
    } 
    public string Text { get; set; } 
    public override string ToString() 
    { 
     return Text; 
    } 
} 

private static ObservableCollection<UserData> _userdata = new ObservableCollection<UserData>(); 
    public static ObservableCollection<UserData> Userdata 
    { 
     get { return _userdata; } 
     set { _userdata = value; } 
    } 
} 

XAML

<ComboBox 
    HorizontalAlignment="Left" 
    Height="24" 
    Margin="5,3,0,0" 
    VerticalAlignment="Top" 
    Width="112" 
    x:Name="cbApplications" 
    DropDownClosed="cbApplications_DropDownClosed" 
    ItemsSource="{Binding Path=Userdata}"/> 

사람이이 문제에 저를지지 할 수 있을까?

+0

어떻게 사용자 데이터가 업데이트됩니까? –

+0

ObservableCollection <>'에 대한 세터가 없어야합니다. 이렇게하면 데이터가 고아가되어 뷰에서 데이터를 볼 수 없습니다. 생성자에서 한 번 할당하십시오. – MickyD

+0

@MickyD Userdata 속성에 대해 PropertyChanged 이벤트를 발생시키는 경우에는 그렇지 않습니다. – Clemens

답변

1

정적을 제거하십시오. 이유가 있습니까? 클래스에 INotifyPropertyChanged를 구현합니다. 그런 다음 특정는 그 관련된 데이터 내용이 없습니다 UI 당신은 당신이 뭔가를 필요로하지 않는 바인딩 또는 ICommand의에 폐쇄 명령을 이동해야 청결, 또한 당신의

set { _userdata = value; OnPropertyChanged("Userdata"); } 

에 추가 할 수 있습니다.

그래도 문제가 해결되지 않으면 알려주세요.

나는 이것을 처리하기 위해 기본 클래스를 만드는 것을 좋아한다.) (

OnPropertyChanged를;

public abstract class BaseViewModel : INotifyPropertyChanged 
{ 
    //MEMBERS 
    public event PropertyChangedEventHandler PropertyChanged; 


    //PROPERTIES 
    public void OnPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 

그런 다음처럼 세터에서 호출 할 수 있습니다 에는 매개 변수가 없습니다.

2

당신은이 같은 뷰 모델 클래스가 있어야합니다

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<UserData> UserData { get; } 
     = new ObservableCollection<UserData>(); 

    private UserData selectedUserData; 

    public UserData SelectedUserData 
    { 
     get { return selectedUserData; } 
     set 
     { 
      selectedUserData = value; 
      PropertyChanged?.Invoke(this, 
       new PropertyChangedEventArgs(nameof(SelectedUserData))); 
     } 
    } 
} 

을이처럼 바인딩 :

<ComboBox ItemsSource="{Binding UserData}" 
      SelectedItem="{Binding SelectedUserData}" 
      DisplayMemberPath="Text"/> 
당신의 MainWindow를의 생성자에서

(또는 다른 적절한 장소), 초기화 뷰 모델을 만들고 Window의 DataContext 속성에 할당합니다.

public MainWindow() 
{ 
    InitializeComponent(); 

    var vm = new ViewModel(); 
    vm.UserData.Add(new UserData { Text = "User 1" }); 
    vm.UserData.Add(new UserData { Text = "User 2" }); 
    vm.UserData.Add(new UserData { Text = "User 3" }); 
    vm.SelectedUserData = vm.UserData[1]; 

    DataContext = vm; 
} 

참고 tha ComboBox의 DisplayMemberPath 속성을 설정하거나 ItemTemplate을 선언 할 수 있으므로 UserData 클래스의 ToString 메서드를 재정의 할 필요가 없습니다.