我正在尝试将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 :(得分: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(); 没有任何参数。