如何避免使用MVVM(WPF)创建View实例

时间:2015-11-30 16:40:20

标签: wpf mvvm view viewmodel

我刚认识到,每当我使用MVVM并尝试使用View显示ViewModel时,都会创建一个View实例,尽管我只使用相同的ViewModel。

在我的视图中是一个GridView。我在代码隐藏中写了这个来调用ViewModel的事件。

private void gridView_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
    DataContext.CallOnClick((DataContext as IHasSelectedItem<IViewModel>)?.SelectedItem);
}

问题是,如果我在View的代码隐藏中定义了一些事件,我将不止一次地获取事件,因为始终会创建View的实例,并且每个实例都会向ViewModel发送事件。 / p>

是否有人,也有这个问题。或者有人知道解决方案?非常感谢!

-------------------------------------------- -----------------

添加: 我改变了我的代码隐藏方式。它工作,我只有一次事件。但我不确定,其他意见是否已被处理。

public TestView()
{
   InitializeComponent();
   IsVisibleChanged += TestView_IsVisibleChanged;
}

private void TestView_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
   if (e.NewValue.Equals(false))
   {
       MyGridView.SelectionChanged -= gridView_SelectionChanged;                
   }
   else
   {
       MyGridView.SelectionChanged += gridView_SelectionChanged;
   }
}

private void gridView_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
   DataContext.CallOnClick((DataContext as IHasSelectedItem<IViewModel>)?.SelectedItem);
}

1 个答案:

答案 0 :(得分:2)

针对您的问题的MVVM解决方案是根本不使用IsVisibleChanged事件。而不是那样,我们只需在视图模型中创建一个bool属性:

private bool isVisible = false;

public bool IsVisible
{
    get { return isVisible; }
    set { isVisible = value; NotifyPropertyChanged("IsVisible"); }
}

现在,您可以使用BooleanToVisibilityConverter将此属性数据绑定到相关控件的Visibility属性:

Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"

现在只要Visibility属性发生变化,IsVisible setter就会被调用,所以你可以在那里处理它:

public bool IsVisible
{
    get { return isVisible; }
    set 
    {
        isVisible = value; 
        NotifyPropertyChanged("IsVisible");
        // Handle the change of visibility here... maybe call a method from here?
    }
}