嗨所以我为我的游戏创建了一个ObservableCollection,它与我的绑定等完美配合。现在我只是遇到问题我无法从其他类访问它。尝试过大多数事情,但我可能会遗漏一些明显的事情。
提前致谢!
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)
}
}
答案 0 :(得分:0)
如果让你的GamePiece-collection静态,
public static ObservableCollection<Pieces> GamePiece{ get; set; }
然后在Game1中,您可以使用
访问它MainWindow.GamePiece
答案 1 :(得分:0)
这不是访问您的收藏集的问题,而是获取对MainWindow
对象的引用的问题。一个简单,有点天真的方法就是这样:
var mainWindow = Application.Current.Windows.OfType<MainWindow>().Single();
var gamePiece = mainWindow.GamePiece;
更好的方法是使用MV*
模式之一,将模型与后面的代码分开,并将模型的引用传递给您想要使用它的代码。提供所有必要的细节几乎不属于单个SO答案的范围,但这里有一些starting point(注意:这几乎重新发明了轮子;一旦你了解了基础知识,最好使用一些现有的MVVM库,例如MVVM Light)。
答案 2 :(得分:0)
你不能说GamePiece.Add在另一个类里面,因为GamePiece不是一个类型,而是另一个类型中的属性。您可以通过两种方式访问它
您要么将该属性设置为静态,这样您就不必实例化MainWindow类并像这样访问它:
MainWindow.GamePiece.Add(new Piece());
你保持原样,但这一次创建一个MainWindow类的实例,然后通过该对象访问它,如下所示:
(new MainWindow())。GamePiece.Add(new Piece());
或使其看起来更优雅
MainWindow mw=new MainWindow();
mn.GamePiece.Add(new Piece());
说实话,我以前从未做过WPF。我只是提醒一下访问另一种类型的财产的正确方法。
答案 3 :(得分:0)
虽然将此属性更改为静态将起作用(同时可能在将来创建其他问题)。 您需要考虑为什么有一个类访问窗口的数据上下文并对其进行操作,而实际上并没有引用该窗口的实例。
考虑为数据上下文设置一个专用类,并将它的实例注入窗口和&#34; test1&#34;,这样他们都可以访问它,并且可以在没有它的情况下操作它MainWindow耦合到&#34; test1&#34;。
要更深入地了解此概念,请查看MVVM design pattern。
另请注意,如果您从不是UI线程的线程对此 ObservableCollection 执行操作,您将获得一个异常,因为它由UI线程拥有。 要解决这个问题,你应该使用Dispatcher类,它将把操作动作委托给来自其他后台线程的UI线程。
答案 4 :(得分:0)
您可以这样创建静态属性:
Option Explicit
Public Sub test()
Dim ws As Worksheet, loginDetails(), currentLogin As Long, pairs() As String, lastRow As Long
Set ws = Workbooks("name of CSV").Worksheets("Sheet1") '<==change this to the open CSV name
Dim pword As String, username As String
With ws
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
If lastRow = 1 Then '<change to 2 if header present
ReDim loginDetails(1, 1): loginDetails(1, 1) = .Range("A1").Value '<= change this to A2 if header
Else
loginDetails = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value 'Change to A2: if header present
End If
For currentLogin = LBound(loginDetails, 1) To UBound(loginDetails, 1)
pword = vbNullString: username = vbNullString
If InStr(loginDetails(currentLogin, 1), ";") > 0 Then
pairs = Split(loginDetails(currentLogin, 1), ";")
username = pairs(0)
pword = pairs(1)
'Debug.Print username, pword
'other code to test login
End If
Next
End With
End Sub
像这样访问您班上的所有公共财产:
private static MainWindow _instance = null;
public static MainWindow Instannce => _instance ?? (_instance = new MainWindow ());