2014-12-17 3 views
0

Привет, поэтому я создал ObservableCollection для своей игры, которая отлично работает с моими привязками и т. Д. Теперь у меня есть проблема, я не могу получить к ней доступ из других классов. Попробовали большинство вещей, но, вероятно, я пропустил некоторые очевидные вещи.Приобретение моего 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

Вы не можете сказать GamePiece.Add внутри другого класса, поскольку GamePiece - это не тип, а свойство внутри другого типа. Там вы два пути вы можете получить доступ к нему

  1. Вы либо сделать это свойство статические, так что вам не придется создать экземпляр класса MainWindow и доступ к нему, как это:

    MainWindow.GamePiece.Add(new Piece()); 
    
  2. Вы оставьте это как есть, но на этот раз создайте экземпляр класса MainWindow, а затем получите доступ к нему через этот объект, например:

    (новый MainWindow()). GamePiece.Add (новый Piece());

или сделать его более изящным

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

Честно говоря, я никогда прежде не сделал WPF. Я просто напоминаю о правильном способе доступа к собственности на другой тип.

+0

Объявление 1. Вы действительно считаете, что привязка к свойствам статического зрения - правильное направление, чтобы научить кого-то о WPF? Ad 2. Предполагая, что вы действительно хотите использовать класс MainWindow как ... ну, WPF Window, которое, вероятно, уже создано приложением, какова цель этого? – decPL

+1

Знаете, вы правы в этом конкретном случае. Ни один из подходов не является тем, кого я хотел бы предложить кому-то принять. Но я чувствовал недостаток хорошего понимания того, как следует обращаться к полям класса, поэтому я решил пойти общим путем. Я имею в виду, я просто объяснил, что способ, которым OP пытается получить доступ к свойству другого типа, неверен. В противном случае вы правы. –

0

Если сделать ваш GamePiece сбора статичны,

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

, а затем в Game1 вы можете получить доступ к нему с

MainWindow.GamePiece 
+0

OP четко заявляет, что использует привязку 'ObservableCollection' для привязки. Статические свойства имеют некоторые ограничения при использовании в шаблоне привязки данных WPF и, как таковое, следует избегать (например, это однократная привязка, при условии, что новая коллекция никогда не задумывается о пользовательском интерфейсе, если вы приняли на это желание). – decPL

+1

О, прости, я пропустил эту часть. Не обращайте внимания на мой ответ, так как вы абсолютно правы. @decPL – Pochen

0

Это не вопрос о доступе к вашей коллекции, это вопрос получения ссылки на ваш объект MainWindow. Простой, немного наивный подход будет что-то вроде этого:

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

Лучший способ пойти об этом было бы использовать один из MV* шаблонов, разделяя вашу модель из кода позади и передавая ссылку на модель к коду, в котором вы хотите его использовать. Предоставление вам всех необходимых деталей в значительной степени выходит за рамки одного ответа SO, но вот некоторые starting point (обратите внимание: это довольно много изобретает колесо, как только вы знаете основы, лучше использовать некоторую существующую библиотеку MVVM, например MVVM Light) ,

+0

Спасибо большое, я буду искать в MVVM еще больше! –

0

При изменении этого свойства на статичное будет работать (возможно, при создании других проблем в будущем). Вам нужно учитывать, почему у вас есть класс, который обращается к контексту данных окна и манипулирует им, хотя на самом деле не имеет ссылки на экземпляр этого окна.

Рассмотрите наличие выделенного класса для контекста данных и его экземпляр вводится как в окно, так и в «test1», таким образом они оба имеют к нему доступ и могут манипулировать им без подключения MainWindow к «test1», ,

Для более глубокого ознакомления с этой концепцией ознакомьтесь с MVVM design pattern.

Также обратите внимание, что если вы выполните действие над этим ObservableCollection из потока, который не является потоком пользовательского интерфейса, вы получите исключение, потому что оно принадлежит потоку пользовательского интерфейса. Чтобы решить эту проблему, вы должны использовать класс Dispatcher, который будет делегировать действие манипуляции в поток пользовательского интерфейса из других потоков фона.

+0

Спасибо за ввод. Будет больше смотреть на дизайн MVVM, выглядит так гладко, когда вы знаете, как с ним справиться. Если бы у меня была репутация. Спасибо, в любом случае! –

Смежные вопросы