Sql, Wpf, Xaml, C#, Binding data, Dynamic resource, accessing to non-static data, Obtaining a Reference to an Object Sql, Wpf, Xaml, C#, 绑定数据, 动态资源, 访问非静态数据, 获取对象的引用

33 浏览
0 Comments

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获取对这个对象的引用?

非常感谢

非常感谢任何帮助

谢谢

0
0 Comments

问题的出现原因是在两个不同的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文件中共享数据的目的。

0
0 Comments

问题出现的原因是需要在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 action)
    {
        if (!callbacks.ContainsKey(id))
        {
            callbacks[id] = new List>();
        }
        callbacks[id].Add(action);
    }
    public void Unregister(string id, Action 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`的代码后台中,可以注册中介者来接收"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的文章来实现使用弱引用的中介者。

0