将ComboBox与ObservableCollection链接

时间:2017-12-08 17:19:25

标签: c# wpf combobox observablecollection

我正在尝试将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}"/>

有人能在这件事上支持我吗?

2 个答案:

答案 0 :(得分: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;
}

请注意,由于您可以设置ComboBox的DisplayMemberPath属性(或声明ItemTemplate),因此不必覆盖UserData类的ToString方法。

答案 1 :(得分:1)

摆脱静电,有什么理由吗? 在你的类中实现INotifyPropertyChanged。 然后加入

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

此外,为了清洁,您应该将Closed命令移动到绑定或ICommand,除非您需要执行某些仅与UI无关的数据内容。

如果这不能解决你,请告诉我。

我也很多时候都想制作一个基类来处理这个问题。

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


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

}

然后你可以从你的二传手中调用它:

OnPropertyChanged(); 没有任何参数。