До сих пор это работает очень хорошо, потому что переключение между «большими» пользовательскими элементами управления, которые отображаются отдельно, не представляет проблемы. Теперь моя проблема заключается в том, чтобы встроить UserControl в UserControl (скорее всего, динамический внутри одного из этих упомянутых «отдельных» UserControls).
Итак, я иметь один «большой» UserControl SettingsView.xaml:
Код: Выделить всё
UserControlCollectionView.xaml:
Код: Выделить всё
Код: Выделить всё
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)); }
}
}
Я хочу использовать этот элемент управления для различных задач, и поэтому он настолько прост, насколько возможный. Один элемент управления, который следует добавить, например. выглядит следующим образом:
ModuleActivationControlView.xaml
Код: Выделить всё
Код: Выделить всё
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;
}
}
Код: Выделить всё
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)); }
}
}
Код: Выделить всё
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
Извините, я знаю, что здесь много кода. Надеюсь, вы видите, чего мне не хватает.
Подробнее здесь: https://stackoverflow.com/questions/789 ... rol-progra