2015-04-28 2 views
0

Я использую TabControl в одном из моих классов. Тем не менее, я не хочу раздувать этот класс и помещать в него весь код, а также все XAML для TabItems.Имея некоторые проблемы с созданием UserControl с параметром

После некоторого Googling я придумал UserControl. Поэтому я создал UserControl для каждого TabItem, с кодом C# TabItem в этом UserControl.

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

Я создал UserControl в XAML и код выглядит так:

<TabItem Name="userTab" Header="Gebruikers" HorizontalAlignment="Stretch"> 
     <local:UserTabControl x:Name="userTabPanel"/> 
</TabItem> 

Это конструктор код для моего UserControl:

public UserTabControl() { 
     setUsersView(); // NEED DATA FOR THIS 
     setUserData((User)usersView.SelectedItem); 
     InitializeComponent(); 
} 

Это переменная класса в UserControl, который нуждается переменная из родительского окна: private static Parser m_config;

Когда я запускаю это, я получаю ошибка компиляции:

«Ссылка на объект не установлена ​​в экземпляр объекта».

, указывающий на линию XAML, где я создаю свой UserControl.

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

+1

The Us erControl должен предоставить свойство зависимостей, которое может быть привязано к свойству модели представления. Поиск в Интернете для привязки данных MVVM и WPF. – Clemens

+0

Вы всегда можете создавать общедоступные методы в User Control, которые принимают параметры и вызывают их. – Abhinav

+1

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

ответ

-1

Я не уверен, что это лучший способ сделать это, но для меня это сработало хорошо.

Для начала я создаю CustomUserControl класс, который наследует от UserControl с constractor, что получить его родительскую форму в качестве атрибута, как это:

public partial class CustomUserControl : UserControl 
{ 
    MainForm parentForm; 
    public CustomUserControl(MainForm mainForm) 
    { 
     parentForm = mainForm; 
    } 
    ... 
    ... 
    private void doSomthing() 
    { 
     parentForm.MainFormMember = 1; 
    } 
} 

И в MainForm:

public partial class MainForm : Form 
{ 
    private int MainFormMember{ get; set; } 
    private CustomUserControl customUserControl; 

    public MainForm() 
    { 
     InitializeComponent(); 

     // Create and add the CustomUserControl manually and not from ToolBox 
     customUserControl = new CustomUserControl(this); 
     this.Controls.Add(customUserControl); 
    } 

    ... 
    ... 
} 

Таким образом, вы можете получить доступ к компонентам формы из UserControl

+0

Я не собираюсь этого делать. На мой взгляд, UserControl не должен знать свое родительское окно! –

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