从另一个类访问我的ObservableCollection

时间:2014-12-17 11:00:50

标签: c# class

嗨所以我为我的游戏创建了一个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)
       }
}

5 个答案:

答案 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不是一个类型,而是另一个类型中的属性。您可以通过两种方式访问​​它

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

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

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

  3. 或使其看起来更优雅

        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 ());