2015-12-23 2 views
0

Я хочу поделиться следующим классом по меньшей мере между двумя окнами МОФА:обмен класс между двумя окнами МОФА

namespace WPF 
{ 
    class dd_internals 
    { 
     public int current_process_index; 

     public class process_class 
     { 
      public string process_name; 
      public List<string> parm_list; 
      public List<string> var_list; 
      public List<string> statements; 
     } 

     public List<process_class> process_list = new List<process_class>(); 
    } 
} 

Как бы я разделяю один экземпляр этого класса между несколькими окнами?

Код ОК, показывающий dd_internals, передается в конструктор window1, но не используется непосредственно в функции-члене window1.

namespace posting2 
{ 
    public partial class Window1 : Window 
    { 
     public void Member() 
     { 
      int y = Data.current_process_index; 
      // Error: the name 'Data' does not exist in the current context 
     } 

     public Window1(dd_internals data) 
     { 
      int x = data.current_process_index; 
      // ok, it works here. 

      InitializeComponent(); 
     } 
    } 
} 
+0

Не достаточно информации, чтобы действительно сказать, но, возможно, https://en.wikipedia.org/wiki/Singleton_pattern? –

+0

Пожалуйста, объясните, что вы имеете в виду, чтобы «поделиться одним экземпляром». Примером того, что хорошо, что вы думаете, что будет делать, будет полезно. –

+0

делят один экземпляр: это означает, что есть один класс x, и оба окна обновляют его, и обновления отображаются в любом месте, к которому он обращался. В C++ один модуль может определять класс x, а все остальные будут обращаться к классу * ref, где ref = & x. – quincy451

ответ

3

Есть несколько вариантов, например:

  1. Как я могу предположить одно окно можно открыть еще одно окно, так что вы можете просто передать экземпляр этого объекта ко второму окну перед его открытием.
  2. Вы можете хранить его в Application.Properties

    Application.Current.Properties [ "Key"] = MyObject;

  3. Лучший вариант для большего приложения использовать некоторый контейнер зависимостей (существует множество реализаций этого) и хранить общий объект в таком контейнере

  4. Я действительно не нравится одноплодная шаблон, потому что это не на самом деле шаблон, но вы также можете использовать его.
+0

Существует разница в форсировании только одного экземпляра и создание и использование только одного экземпляра. В последнем случае ваш подход работает, но если необходимо, чтобы во время жизненного цикла приложения создавался только один экземпляр, то один из них - путь. Экземпляр может быть передан как параметр или назначен ресурсам приложения. –

0

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

+0

Это необходимо, только если вы хотите, чтобы класс был видимым для других * сборок *. –

+0

Согласовано. Если в одной и той же сборке тогда она не должна быть, по крайней мере, «внутренней». Класс dd_internals, как показано, является «закрытым» по умолчанию. – NER1808

1
var dd = new dd_internals(); 
var window1 = new YourWindow(dd); 
var window2 = new YourWindow(dd); 

Любые изменения, внесенные в dd будут доступны во всех случаях окно. Если вам нужно обрабатывать такие вещи, как многопоточность или иметь dd, вызовите что-то, когда что-то изменилось, вам нужно добавить это к своему вопросу.

Ваше изменение синтаксически недействительно; C# чувствителен к регистру, поэтому Data и data - это два разных идентификатора, один из которых не объявлен. Я предполагаю, что вы хотите что-то вроде:

public partial class Window1 : Window 
{ 
    private readonly dd_internals myDd; 

    public void Member() 
    { 
     int y = myDd.current_process_index; 
    } 

    public Window1(dd_internals data) 
    { 
     InitializeComponent(); 
     myDd = data; 
    } 
} 

В вашем реальном проекте, пожалуйста, используйте лучшие имена, чем «данные», «window1» и др. Эти имена ничего не значат; в кратком примере они полезны, но они быстро делают реальную программу непонятной.

+0

Проблема, которую я здесь, dd видна только в say window1 constructor ..., чтобы сделать ее доступной для любой функции-члена окна1, вам нужно что-то вроде local_dd = dd и сделать local_dd что-то в окне1. Что я могу сделать ... но затем на выходе windows1 вы должны скопировать его dd = local_dd ... кажется беспорядочным. – quincy451

+0

Вам нужно создать 'dd' вне конструктора окна и передать его. Вам не нужно ничего копировать. Пожалуйста, отредактируйте (http://stackoverflow.com/posts/34440333/edit) свой пост, чтобы показать свой код, поскольку я не понимаю, в чем заключается сложность. –

+0

код добавлен, чтобы показать проблему. – quincy451

0

Вы можете сделать класс одноплодной

public class dd_internals 
    { 
     private static dd_internals instance; 
     public static dd_internals singleInstance; 

     private dd_internals() { } 

     public static dd_internals Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new dd_internals(); 
       } 
       return instance; 
      } 
     } 

     public int current_process_index; 
     public class process_class 
     { 
      public string process_name; 
      public List<string> parm_list; 
      public List<string> var_list; 
      public List<string> statements; 
     } 
     public List<process_class> process_list = new List<process_class>(); 
    } 
+0

Небезопасный способ реализации синглтона. –

+0

получил это для работы. – quincy451

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