Могу ли я подключить две модели ViewModel без DependencyProperty? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть MainWindow (упрощено для ясности):

<Window>
    <!-- (...) -->

    <Window.DataContext>
         <vm:MainWindowViewModel />
    </Window.DataContext>

    <!-- (...) -->

    <CheckBox IsChecked="{Binding ShowAdvanced}" Content="Advanced view" />
    <uc:MyUserControl DataContext={Binding MyUserControlViewModel} />
</Window>

MainWindowViewModel:

public partial class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel()
    {
         MyUserControlVM = new MyUserControlViewModel();
    }

    private bool _showAdvanced;
    public bool ShowAdvanced
    {
        get => _showAdvanced;
        set { _showAdvanced = value; NotifyPropertyChanged(); }
    }

    private MyUserControlViewModel _myUserControlVM;
    public MyUserControlViewModel MyUserControlVM
    {
        get => _myUserControlVM;
        set { _myUserControlVM= value; NotifyPropertyChanged(); }
    }
}

В моем UserControl у меня есть некоторые элементы управления, которые должны быть скрыты, когда установлен флажок «Показать дополнительные»не проверено.

<GroupBox Header="Some advanced stuff"
    Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.(vm:MainWindowViewModel.ShowAdvanced), Converter={StaticResource BoolToVis}}">
    <!-- (...) -->
</GroupBox>

Это на самом деле работает, но мне это не нравится, потому что UserControl полагается на MainWindow.

Как правильно подключить эти модели представления без DependencyProperty?

Я пытался добавить это в MyUserControlViewModel:

public MyUserControlViewModel(MainWindowViewModel parent)
{
    Parent = parent;
}

private MainWindowViewModel _parent;
public MainWindowViewModel Parent
{
    get { return _parent; }
    set { _parent = value; NotifyPropertyChanged(); }
}

и привязать видимость к одному из элементов управления MyUserControl следующим образом:

Visibility="{Binding Parent.ShowAdvanced}"

, но это не работает(MyUserControl не получает уведомления?).

1 Ответ

0 голосов
/ 11 июля 2019

Добавьте свойство ShowAdvanced к управляющей виртуальной машине и присвойте значение каждой управляющей виртуальной машине всякий раз, когда новое значение присваивается свойству MainViewModel ShowAdvanced.

public class MainViewModel : Base.ViewModelBase
{
    private bool _showAdvanced;

    public MainViewModel()
    {
        MyUserControl1 = new MyUserControlViewModel { Message = "Control 1" };
        MyUserControl2 = new MyUserControlViewModel { Message = "Control 2" };
        MyUserControl3 = new MyUserControlViewModel { Message = "Control 3" };
    }

    public bool ShowAdvanced
    {
        get => _showAdvanced;
        set
        {
            this.RaiseAndSetIfChanged( ref _showAdvanced, value );
            MyUserControl1.ShowAdvanced = value;
            MyUserControl2.ShowAdvanced = value;
            MyUserControl3.ShowAdvanced = value;
        }
    }

    public MyUserControlViewModel MyUserControl1 { get; }
    public MyUserControlViewModel MyUserControl2 { get; }
    public MyUserControlViewModel MyUserControl3 { get; }
}

public class MyUserControlViewModel : Base.ViewModelBase
{
    private bool _showAdvanced;
    private string _message;

    public bool ShowAdvanced { get => _showAdvanced; set => this.RaiseAndSetIfChanged( ref _showAdvanced, value ); }
    public string Message { get => _message; set => this.RaiseAndSetIfChanged( ref _message, value ); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...