从ObservableCollection <cproject>对象</cproject>获取字符串属性

时间:2012-11-16 14:32:18

标签: c# mvvm observablecollection

在我的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冲突的字符串。

3 个答案:

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