0

私は WPF アプリケーションを作成しており、現在、再利用されたコードを、他のビューモデルが継承できる基本 ViewModel クラスにリファクタリングしています。

この基本クラスの 1 つのプロパティ フィールドは

public class MessageParentBase
{
  MessageParentBase() {}

  public string Name;
}

internal ObservableCollection<MessageParentBase> _GridData = new ObservableCollection<MessageParentBase>();

後続のプロパティ宣言があります

public ObservableCollection<MessageParentBase> GridData
    {
        get { return _GridData; }
        set { _GridData = value; }
    }

これはうまく機能し、私の問題はすべて、初期化されたクラスが実際にフォロークラスを使用することです

Public class ChatMessage : MessageParentBase
{
    public string Message;
}

ビューには、この GridData プロパティにバインドされたデータのグリッドが含まれていますが、ChatMessage クラスの Message フィールドにバインドされる必要がある列が空白で、MessageParentBase クラスにあるフィールドが入力されています。

したがって、ビューが MessageParentBase クラスから ChatMessage にキャストすることを知らないという問題があると思います。

オブジェクトが「ChatMessage」タイプになることをビューに通知できますか。

プロパティ宣言を継承されたビューモデルに移動しようとしました

public ObservableCollection<ChatMessage> GridData
    {
        get { return _GridData; }
        set { _GridData = value; }
    }

しかし、これは私に次のエラーを与えます:-

タイプ 'System.Collections.ObjectModel.ObservableCollection' を 'System.Collections.ObjectModel.ObservableCollection' に暗黙的に変換することはできません

ビュー レベルでキャストする必要がありますか、それともビューモデルを変更してこれをより適切に実装できますか?

どんな提案でも大歓迎です。

エムリン

4

2 に答える 2

0

コレクションを次のように変更します。

public ObservableCollection<MessageParentBase> GridData { get; set; }

次に、コンストラクターに追加します

this.GridData = new ObservableCollection<MessageParentBase>();

WPF はリフレクションを使用してデータ コンテキストからバインドされたデータを取得するため、そのコレクションに格納されている派生クラスの値を取得できるはずです。

また、アプリケーションを実行し、[デバッグ] を選択して出力ウィンドウを確認すると、XAML エンジンによってバインド エラーが出力されます。

于 2013-02-15T17:49:02.740 に答える
0

ViewModel には、グリッドが表示するタイプ (この場合は ChatMessage タイプ) のリストが含まれている必要があります。継承を使用して一般的なメソッドを呼び出すことはできますが、バインドされたリストは ChatMessage タイプである必要があります

于 2013-02-15T18:43:26.100 に答える