2017-12-08 10 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を実装します。 が続いても、あなたの

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

に追加するには、関連付けられたデータの内容を持っていないUIの特定だけで何かをする必要がされない限り、清潔さのためにあなたは、結合またはICommandのにあなたのクローズコマンドを移動する必要があります。

これで解決できない場合は教えてください。

また、私はこれを処理する基本クラスを作るのが好きです。

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


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

} 

その後、あなたはあなたのようなセッターからそれを呼び出すことができます。OnPropertyChangedを

(); にはパラメータがありません。

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"/> 

、初期化ビューモデルを作成し、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メソッドをオーバーライドする必要はありません。

関連する問題