0

在我的 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

4

3 回答 3

2

您的组合框包含一个名为 DisplayMemeberPath 的属性,将其设置为“database.name”。使用视图进行输出格式化,而不是视图模型!

或为组合框中的项目创建模板

<ComboBox ItemsSource="{Binding ...}">
<ComboBox.ItemsTemplate>
<DataTemplate>
<Label Content="{Binding database.name}"/>
</DataTemplate>
</ComboBox.ItemsTemplate>
</ComboBox>
于 2012-11-16T14:37:42.140 回答
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));
于 2012-11-16T14:39:42.483 回答
1

首先将视图的数据上下文设置为 ViewModel。

看法 :

public YourWindowView()
        {

            this.DataContext = new YourWindowViewModel();
        }

然后在ViewModel ViewModel中填写Project列表

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" />
于 2012-11-16T14:52:42.507 回答