C# динамически добавлять пользовательский элемент управления в проекте wpf к другому пользовательскому элементу управленC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# динамически добавлять пользовательский элемент управления в проекте wpf к другому пользовательскому элементу управлен

Сообщение Anonymous »

Я работаю над проектом с несколькими элементами UserControl и MVVM. Задача состоит в том, чтобы создать динамический пользовательский интерфейс, чтобы предотвратить использование всплывающих окон с помощью Show() или ShowDialog().
До сих пор это работает очень хорошо, потому что переключение между «большими» пользовательскими элементами управления, которые отображаются отдельно, не представляет проблемы. Теперь моя проблема заключается в том, чтобы встроить UserControl в UserControl (скорее всего, динамический внутри одного из этих упомянутых «отдельных» UserControls).
Итак, я иметь один «большой» UserControl SettingsView.xaml: Отображение этого встроенного пользовательского элемента управления — это нормально, но внутри этого пользовательского элемента управления теперь другие пользовательские элементы управления должны добавляться динамически с помощью кода в классе модели представления. Этот встроенный UserControl выглядит примерно так:
UserControlCollectionView.xaml: Текущий проект CommonUserControlCollectionViewModel.cs:

Код: Выделить всё

public class CommonUserControlCollectionViewModel : INotifyPropertyChanged
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
{
// take a copy to prevent thread issues
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion

private ObservableCollection _uc01Children;
public ObservableCollection Uc01Children
{
get => _uc01Children;
set { _uc01Children = value; RaisePropertyChanged(nameof(Uc01Children)); }
}

private ObservableCollection _uc02Children;
public ObservableCollection Uc02Children
{
get => _uc02Children;
set { _uc02Children = value; RaisePropertyChanged(nameof(Uc02Children)); }
}

private UserControl _uc03;
public UserControl Uc03
{
get =>  _uc03;
set { _uc03 = value; RaisePropertyChanged(nameof(Uc03)); }
}

private UserControl _uc04;
public UserControl Uc04
{
get => _uc04;
set { _uc04 = value; RaisePropertyChanged(nameof(Uc04)); }
}
}
То, что вы видите здесь, является результатом нескольких тестов, вызванных моим исследованием проблемы на этой странице (например, добавление элемента WPF... или добавление Usercontrol C#...). Мой первоначальный проект представлял собой просто использование нескольких элементов UserControl, как в SettingsView.xaml.
Я хочу использовать этот элемент управления для различных задач, и поэтому он настолько прост, насколько возможный. Один элемент управления, который следует добавить, например. выглядит следующим образом:
ModuleActivationControlView.xaml ModuleActivationControlView.xaml.cs:

Код: Выделить всё

public partial class ModuleActivationControlView : UserControl
{
private readonly ModuleActivationControlViewModel _dataContext;

public ModuleActivationControlView()
{
InitializeComponent();
_dataContext = DataContext as ModuleActivationControlViewModel;
}

public void InitializeView(string moduleName, bool isModuleActive, bool isModuleInstalled)
{
_dataContext.ModuleName = moduleName;
_dataContext.IsModuleActive = isModuleActive;
_dataContext.CanModuleBeUsed = isModuleInstalled;
}

public bool GetModuleActivationStatus()
{
return _dataContext.IsModuleActive;
}
}
ModuleActivationControlViewModel.cs:

Код: Выделить всё

public class ModuleActivationControlViewModel : INotifyPropertyChanged
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
{
// take a copy to prevent thread issues
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion

private string _moduleName = "Starting Test String";
public string ModuleName
{
get => _moduleName;
set { _moduleName = value; RaisePropertyChanged(nameof(ModuleName)); }
}

private bool _canModuleBeUsed = false;
public bool CanModuleBeUsed
{
get => _canModuleBeUsed;
set { _canModuleBeUsed = value; RaisePropertyChanged(nameof(CanModuleBeUsed)); }
}

private bool _isModuleActive = false;
public bool IsModuleActive
{
get => _isModuleActive;
set { _isModuleActive = value; RaisePropertyChanged(nameof(IsModuleActive));  }
}
}
Итак, в трех предыдущих фрагментах кода моя идея заключалась в том, чтобы установить этот простой UserControl и добавить его в SettingsViewModel.cs:

Код: Выделить всё

private void CallUpdateModuleList()
{
var _control01 = new ModuleActivationControlView();
((ModuleActivationControlView)_control01).InitializeView("TestControl01", false, true);
ModuleControl.UserControlPanel01.Children.Clear();
ModuleControl.UserControlPanel01.Children.Add(_control01);

var control02 = new ModuleActivationControlView();
control02.InitializeView("TestControl02", false, true);
ModuleControl.UserControlPanel02.Children.Clear();
ModuleControl.UserControlPanel02.Children.Add(control02);

var control03 = new ModuleActivationControlView();
control03.InitializeView("TestControl03", false, true);
//ModuleControl.UserControlPanel03 = control03;
((CommonUserControlCollectionViewModel)ModuleControl.UserControlPanel03.DataContext).Uc03 = control03;

var control04 = new ModuleActivationControlView();
control04.InitializeView("TestControl04", false, true);
//ModuleControl.UserControlPanel04 = control04;
((CommonUserControlCollectionViewModel)ModuleControl.UserControlPanel04.DataContext).Uc04 = control04;
}
Это также результат нескольких тестов после исследования, поскольку в настоящее время я не могу добавить новый UserControl в этот «список управления пользователями» —

Код: Выделить всё

UserControl
и мне кажется, что я что-то упустил, но я этого не вижу.
Извините, я знаю, что здесь много кода. Надеюсь, вы видите, чего мне не хватает.

Подробнее здесь: https://stackoverflow.com/questions/789 ... rol-progra
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C# динамически добавлять пользовательский элемент управления в проекте wpf к другому пользовательскому элементу управлен
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как привязать список к пользовательскому элементу управления Listview в WPF?
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Как передать объект пользовательскому элементу управления WPF
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Как передать объект пользовательскому элементу управления WPF
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Как передать объект пользовательскому элементу управления WPF
    Anonymous » » в форуме C#
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»