0

私の質問は比較的簡単だと思います。データを表示するページがあります。ボタンをクリックすると、現在の要素の datacontext の 2 層上の要素の datacontext を持つ新しいページが開きます。

説明:

私のViewModelは、より多くのViewModelを含むクラス(ViewModelContainer)です。1 つは値の要約で、もう 1 つはその詳細ビューです。

public class SummaryViewModel
{
     public int somevalue; // is a property
     public ObservableCollection<SummarizedItems> items; // is a property
}

public class DetailsViewModel
{
     public int someOthervalue; // is a property
     public int stuffA; // is a property
     public int stuffB; // is a property
}

public class ViewModelContainer : ViewModelBase
{
     private SummaryViewModel _sum;
     public SummaryViewModel sum { }  // is a property

     private DetailsViewModel _det;
     public DetailsViewModel det { }  // is a property
}

ボタンを押すことができるビューは、SummaryViewModel の ObservableCollection の値にバインドされています。今まですべて順調です。ボタンを押すと、詳細を示す新しいページが開きます。ICommand を使用してクリックを処理し、詳細ビューに CommandParameter として渡します。

<Button Name="OpenDetailsButton" Command="{Binding Path=ACommand}" CommandParameter="{DynamicResource Details}"

データ コンテキストがまだ ViewModelContainer である同じファイル内のリソースとしてページを定義します。

<pages:DetailsViewPage DataContext="{Binding Path=det }"  x:Key="Details"/>

ページは開きますが、データ コンテキストは使用できません。次のエラーが表示されます。

  System.Windows.Data Error: 3 : Cannot find element that provides DataContext.

詳細ビューを開いてデータコンテキストを提供する方法を知っている人はいますか? DetailsViewModel を別のクラスに移動することはできません。そこでしか更新できないためです。

ありがとう

4

2 に答える 2

0

ヘルパーを作成してビジュアル ツリーを上って、必要な要素のデータ コンテキストを使用することで問題を解決しました。助けようとしたみんなに感謝します:)

メソッドは次のようになります。

    public static UIELEMENT FindUiElementUpVisualTree(DependencyObject initial)
    {
        DependencyObject current = initial;

        while (current != null && current.GetType() != typeof(UIELEMENT))
        {
            current = VisualTreeHelper.GetParent(current);
        }
        return current as UIELEMENT;
    }

ここで、UIELEMENT は、ウィンドウやボタンなど、探しているオブジェクトです。

于 2012-11-17T23:48:36.423 に答える
0

通常、ビューとビューモデルは 1 対 1 の関係にあります。この場合、多対 1 の関係があるように見えます。DetailsPageViewModel はどうですか?

于 2012-11-18T20:10:10.017 に答える