从另一个类访问我的可观察集合
本文关键字:观察 集合 我的 访问 另一个 | 更新日期: 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不是一个类型,而是另一个类型中的一个属性。您可以通过两种方式访问它
-
您可以将该属性设置为静态,这样就不必实例化 MainWindow 类并像这样访问它:
MainWindow.GamePiece.Add(new Piece());
-
你保持原样,但这次创建 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());