从另一个类访问我的可观察集合

本文关键字:观察 集合 我的 访问 另一个 | 更新日期: 2023-09-27 18:34:25

嗨,所以我为我的游戏创建了一个可观察集合,它与我的绑定等完美配合。现在我只是遇到了无法从其他类访问它的问题。已经尝试了大多数东西,但我可能错过了一些明显的东西。

提前感谢!

namespace Game1
{
public partial class MainWindow : Window
{

    public ObservableCollection<Pieces> GamePiece{ get; set; }
    public MainWindow()
    {
       GamePiece= new ObservableCollection<Pieces>();
       InitializeComponent();
       DataContext = ChessItem;
       // Here i can add GamePiece.add(new Pieces() ....) etc which works
    }
}
 //Another file
 namespace Game1
 {
    public class test1
    {
       public test1()
       {
         //How to access GamePiece from here? Like GamePiece.add(etc)
       }
}

从另一个类访问我的可观察集合

你不能说GamePiece.Add在另一个类中,因为GamePiece不是一个类型,而是另一个类型中的一个属性。您可以通过两种方式访问它

  1. 您可以将该属性设置为静态,这样就不必实例化 MainWindow 类并像这样访问它:

    MainWindow.GamePiece.Add(new Piece()); 
    
  2. 你保持原样,但这次创建 MainWindow 类的实例,然后通过该对象访问它,如下所示:

    新的主窗口())。GamePiece.Add(new Piece());

或使其看起来更优雅

    MainWindow mw=new MainWindow();
    mn.GamePiece.Add(new Piece()); 

老实说,我以前从未做过WPF。我只是提醒访问另一种类型的属性的正确方法。

如果将 GamePiece-collection 设为静态,

public static ObservableCollection<Pieces> GamePiece{ get; set; }

然后在 Game1 中

您可以使用
MainWindow.GamePiece

这不是访问集合的问题,而是获取对MainWindow对象的引用的问题。一个简单、有点幼稚的方法应该是这样的:

var mainWindow = Application.Current.Windows.OfType<MainWindow>().Single();
var gamePiece = mainWindow.GamePiece;

更好的方法是使用MV*模式之一,将模型与隐藏的代码分开,并将对模型的引用传递给要使用它的代码。给你所有必要的细节几乎超出了一个单一的SO答案的范围,但这里有一些起点(注意:这几乎是在重新发明轮子;一旦你了解了基础知识,最好使用一些现有的MVVM库,例如MVVM Light)。

虽然将此属性更改为静态将起作用(同时将来可能会产生其他问题)。您需要考虑为什么有一个类访问窗口的数据上下文并对其进行操作,而实际上却没有对该窗口实例的引用。

考虑为数据上下文创建一个专用类,并将其实例注入窗口和"test1",这样它们都可以访问它,并且可以在不将 MainWindow 耦合到"test1"的情况下对其进行操作。

要更深入地了解此概念,请查看 MVVM 设计模式。

另请注意,如果从不是 UI 线程的线程对此可观察集合执行操作,则会收到异常,因为它归 UI 线程所有。若要解决此问题,应使用 Dispatcher 类,该类会将操作操作从其他后台线程委托给 UI 线程。

你可以像这样创建静态属性:

private static MainWindow _instance = null;
public static MainWindow Instannce => _instance ?? (_instance = new MainWindow ());

访问类中的所有公共属性,如下所示:

MainWindow.Instannce.GamePiece.Add(new Piece());