2

さて、私はWPFとXAMLにかなり慣れていませんが、検索したにもかかわらず、簡単な解決策を見つけることができず、すぐに答えを見つけることができないようです。

質問はとても単純です。WPFプロジェクトを作成し、SelectList.xamlにデータグリッドを作成しました。行を選択したら、選択した行をオブジェクトに保存します。このオブジェクトは「カテゴリ」と呼ばれます。これまでのところすべて問題ありませんが、他の場所temp.xamlからこのオブジェクトへの参照を取得する方法がわかりません。

どうもありがとうございましたどんな助けでも大歓迎です乾杯

4

2 に答える 2

2

WPFで間接通信を提供する一般的な方法は、メディエーターパターンを活用することです。メディエーターを使用して、カテゴリーの選択を公開し、一時ビューにカテゴリーの選択の変更の通知をサブスクライブさせることができます。

具体的なメディエーターの簡単な例については、http://www.eggheadcafe.com/tutorials/aspnet/ec832ac7-6e4c-4ea8-81ab-7374d3da3425/wpf-and-the-model-view-vi.aspxを参照してください。より堅牢な実装が必要な場合は、Mediatorパターンの実装を提供する一般的なMVVMフレームワークもいくつかあります。

単純なメディエーターの実装:

public sealed class Mediator
{
    private static Mediator instance = new Mediator();
    private readonly Dictionary<string, List<Action<object>>> callbacks 
      = new Dictionary<string, List<Action<object>>>();

    private Mediator() { }

    public static Mediator Instance
    {
        get
        {
            return instance;
        }
    }

    public void Register(string id, Action<object> action)
    {
        if (!callbacks.ContainsKey(id))
        {
            callbacks[id] = new List<Action<object>>();
        }

        callbacks[id].Add(action);
    }

    public void Unregister(string id, Action<object> action)
    {
        callbacks[id].Remove(action);

        if (callbacks[id].Count == 0)
        {
            callbacks.Remove(id);
        }
    }

    public void SendMessage(string id, object message)
    {
        callbacks[id].ForEach(action => action(message));
    }
}

SelectList.xamlコードビハインド:

private void DataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    var category = e.AddedItems.FirstOrDefault() as Category;

    if(category != null)
    {
        Mediator.Instance.SendMessage("Category Selected", category);
    }
}

Temp.xamlコードビハインド:

public Temp()
{
  InitializeComponent();

  Mediator.Instance.Register
  (
      "Category Selected",
      OnCategorySelected
  );
}

private void OnCategorySelected(object parameter)
{
  var selectedCategory = parameter as Category;

  if(selectedCategory != null)
  {
  }
}
于 2010-12-01T21:41:08.380 に答える
0

「Temp.xaml」コードビハインドファイルでこの「category」オブジェクトの参照を受け入れるアクセス可能なメソッド(必要に応じてパブリック)を作成します。次に、このメソッドを使用して、「SelectList.xaml」コードビハインドファイルから「Temp.xaml」ファイルに「category」オブジェクトを渡します。

于 2010-12-01T20:22:49.703 に答える