在我的C#应用程序中,我正在调用一个返回数组的方法:
projectArray = client.getProjectList(username, password);
由于我想使用MVVM模式将应用程序重构为WPF,我应该使用ObservableCollection
作为项目列表。
我的视图模型包含:
// Members
CProject[] projectArray;
ObservableCollection<CProject> projectList;
// Properties
public ObservableCollection<CProject> ProjectList {
get { return projectList; }
set {
projectList = value;
OnPropertyChanged("ProjectList");
}
}
设置属性的代码:
projectArray = client.getProjectList(username, password);
projectList = new ObservableCollection<CProject>(projectArray);
this.ProjectList = projectList;
这就是问题所在。我的视图包含一个组合框,它与视图模型的ProjectList
属性绑定。绑定工作正常。但是,组合框显示的值为MyApp.SoapApi.CProject
。我想显示可通过CProject.database.name
访问的项目名称。
这样做的正确方法是什么?我尝试使用projectList = value.database.name
,但这是一个与属性类型CProject
冲突的字符串。
答案 0 :(得分:2)
您的组合框包含一个名为DisplayMemeberPath的属性,将其设置为“database.name”。 使用视图进行输出格式化,而不是查看模型!
或为组合框中的项目创建模板
<ComboBox ItemsSource="{Binding ...}">
<ComboBox.ItemsTemplate>
<DataTemplate>
<Label Content="{Binding database.name}"/>
</DataTemplate>
</ComboBox.ItemsTemplate>
</ComboBox>
答案 1 :(得分:1)
您应该将组合框的DisplayMemberPath设置为要在组合框文本中显示的属性的路径:
<ComboBox DisplayMemberPath="database.name" />
另外,您的代码可以简化为:
// Members
ObservableCollection<CProject> projectList;
// Properties
public ObservableCollection<CProject> ProjectList {
get { return projectList; }
set {
projectList = value;
OnPropertyChanged("ProjectList");
}
}
this.ProjectList = new ObservableCollection<CProject>(client.getProjectList(username, password));
答案 2 :(得分:1)
首先将视图的datacontext设置为ViewModel。
查看:
public YourWindowView()
{
this.DataContext = new YourWindowViewModel();
}
然后填写ViewModel中的项目列表
ViewModel:
public class YourWindowViewModel : INotifyPropertyChanged
{
ObservableCollection<CProject> projectList;
// Properties
public ObservableCollection<CProject> ProjectList {
get { return projectList; }
set {
projectList = value;
OnPropertyChanged("ProjectList");
}
}
public YourWindowViewModel ()
{
// fill project list here
this.ProjectList = new ObservableCollection<CProject>(client.getProjectList(username, password));
}
}
绑定到视图
XAML
<ComboBox ItemsSource="{Binding Path=ProjectList}"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="database.name" />