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ましたが、これはプロパティ type と競合する文字列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 に答える