Такие задачи очень просты, если вы начинаете использовать MVVM.Ниже приведен пример (как своего рода введение).
Для каждого отдельного представления (UserControl
, шаблона данных, окна и т. Д.) Необходимо создать модель представления (ВМ).Представление моделей может иметь сложные отношения.Давайте создадим один:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string property = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
bool _show;
public bool Show
{
get { return _show; }
set
{
_show = value;
OnPropertyChanged();
}
}
}
Как правило, будет больше свойств, и они будут выделены для обработки определенного представления (например, всего в главном окне или определенного пользовательского элемента управления), но на данный момент давайте будем простыми.
Далее давайте воссоздадим вашу проблему: у нас будет StackPanel
и Frame
.Часть кадра будет иметь CheckBox
, используемую для изменения видимости путем привязки к свойству bool.И StackPanel
будет иметь некоторый текст (чтобы увидеть, работает ли он) и привязку видимости к тому же свойству bool.
<Window ... >
<Window.Resources>
<BooleanToVisibilityConverter x:Key="converter"/>
<local:ViewModel x:Key="vm"/>
</Window.Resources>
<StackPanel>
<StackPanel Visibility="{Binding Show, Converter={StaticResource converter}}" DataContext="{StaticResource vm}">
<TextBlock Text="Some test"/>
</StackPanel>
<Frame>
<Frame.Content>
<CheckBox IsChecked="{Binding Show}" DataContext="{StaticResource vm}"/>
</Frame.Content>
</Frame>
</StackPanel>
</Window>
Вся идея MVVM заключается в использовании DataContext
наследования: любой вложенный элемент каркасабудет взят контекст из его родителя.Но в этом примере он устанавливается непосредственно для каждого.
Экземпляр модели представления создается в рамках ресурса Windows.Вам может понадобиться один на уровне приложения и, возможно, даже передать его (не уверен, как выглядит содержимое вашего фрейма).
Конвертер используется для преобразования bool
в Visibility
.
Есливы запускаете его, вы должны увидеть что-то вроде:
