Sql, Wpf, Xaml, C#, Binding data, Dynamic resource, accessing to non-static data, Obtaining a Reference to an Object Sql, Wpf, Xaml, C#, 绑定数据, 动态资源, 访问非静态数据, 获取对象的引用
Sql, Wpf, Xaml, C#, Binding data, Dynamic resource, accessing to non-static data, Obtaining a Reference to an Object Sql, Wpf, Xaml, C#, 绑定数据, 动态资源, 访问非静态数据, 获取对象的引用
好的,嗯,虽然我搜索了很多,但我对WPF和XAML还是很陌生,无法找到简单的解决方案,而且我觉得我很快也找不到答案了。
问题很简单,我创建了一个WPF项目,在SelectList.xaml中有一个数据表格。当选择一行后,我将选中的行保存在一个名为"category"的对象中。到目前为止一切都没问题,但我无法弄清楚如何从另一个地方temp.xaml获取对这个对象的引用?
非常感谢
非常感谢任何帮助
谢谢
问题的出现原因是在两个不同的XAML文件中需要共享数据,但是由于不知道如何获取到Temp.xaml文件的实例引用,导致无法将数据传递给Temp.xaml。
解决方法之一是在Temp.xaml文件中创建一个公共的setter方法,通过该方法接收SelectList.xaml文件中"category"对象的引用,并将其传递给Temp.xaml文件。
解决方法之二是将Temp.xaml文件中的属性设置为静态,并在该属性中处理"category"的引用。或者需要找到一种方法,在创建新的Temp.xaml实例时,将Temp.xaml类的实例引用传递回SelectList.xaml文件。
以下是代码示例:
在Temp.xaml.cs文件中:
public partial class Temp : Window
{
public static Category CategoryInstance { get; set; }
public Temp()
{
InitializeComponent();
}
public void SetCategoryReference(Category category)
{
CategoryInstance = category;
}
}
在SelectList.xaml.cs文件中:
public partial class SelectList : Window
{
private void OpenTempWindow()
{
Temp tempWindow = new Temp();
tempWindow.SetCategoryReference(category);
tempWindow.Show();
}
}
通过以上方法,我们可以在SelectList.xaml文件中获取到Temp.xaml文件的实例引用,并将"category"对象传递给Temp.xaml文件进行处理。这样就实现了在两个不同的XAML文件中共享数据的目的。
问题出现的原因是需要在WPF中实现间接通信。解决方法是使用中介者模式来实现间接通信。可以使用中介者来发布类别的选择,并让临时视图订阅类别选择的更改通知。中介者模式的一个简单实现可以通过以下代码实现:
public sealed class Mediator { private static Mediator instance = new Mediator(); private readonly Dictionary>> callbacks = new Dictionary >>(); private Mediator() { } public static Mediator Instance { get { return instance; } } public void Register(string id, Action
在`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`的代码后台中,可以注册中介者来接收"Category Selected"消息,并执行相应的操作:
public Temp() { InitializeComponent(); Mediator.Instance.Register ( "Category Selected", OnCategorySelected ); } private void OnCategorySelected(object parameter) { var selectedCategory = parameter as Category; if(selectedCategory != null) { // 执行相应的操作 } }
需要注意的是,上述提到的中介者没有使用弱引用,可能会导致内存泄漏。可以参考Josh Smith的文章来实现使用弱引用的中介者。