好的,我对 WPF 和 XAML 还是很陌生,尽管我进行了搜索,但我找不到简单的解决方案,而且在我看来,我很快就无法找到答案。
问题很简单,我创建了一个 WPF 项目并在 SelectList.xaml 中有一个数据网格一旦选择了一行,我将选定的行保存在一个对象中,比如这个对象称为“类别”。到目前为止一切正常,但我不知道如何从其他地方 temp.xaml 获取对该对象的引用?
非常感谢任何帮助将不胜感激干杯
好的,我对 WPF 和 XAML 还是很陌生,尽管我进行了搜索,但我找不到简单的解决方案,而且在我看来,我很快就无法找到答案。
问题很简单,我创建了一个 WPF 项目并在 SelectList.xaml 中有一个数据网格一旦选择了一行,我将选定的行保存在一个对象中,比如这个对象称为“类别”。到目前为止一切正常,但我不知道如何从其他地方 temp.xaml 获取对该对象的引用?
非常感谢任何帮助将不胜感激干杯
在 WPF 中提供间接通信的一种常用方法是利用中介者模式。您可以使用调解器发布您的类别选择,并让临时视图订阅您的类别选择更改的通知。
有关具体中介的简单示例,请参见http://www.eggheadcafe.com/tutorials/aspnet/ec832ac7-6e4c-4ea8-81ab-7374d3da3425/wpf-and-the-model-view-vi.aspx。如果您想要更健壮的实现,还有几个流行的 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)
{
}
}
创建一个可访问的方法(如果您愿意,可以公开),该方法在“Temp.xaml”代码隐藏文件中接受此“类别”对象的引用。然后通过此方法将“SelectList.xaml”代码隐藏文件中的“类别”对象传递给“Temp.xaml”文件。