通过PropertyChangedEvent更改UserControl的可见性

时间:2016-02-04 21:08:34

标签: c# wpf xaml mvvm

更新:完整的工作示例:

我正在使用属性绑定来更改窗口中usercontrol的可见性。使用INotifyPropertyChanged我通知UI更新。

我正在使用this RelayCommand实现。

C#

    //ViewModel:
    public class homeViewModel : INotifyPropertyChanged
    {
    public event PropertyChangedEventHandler PropertyChanged;

       private Visibility _Home;
       public Visibility Home
       {
          get { return _Home; }
          set { 
                 if(_Home == value) return;
                 _Home = value;
                 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Home"));
              }
       }

       public ICommand HideHomeCommand
       {
          get { 
              return new RelayCommand( 
                o => HideUserControl, 
                o => {return Home != Visibility.Collapsed;}
              );
          }
       }
       private void HideUserControl()
       {
          Home = Visibility.Collapse;
       }
       public ICommand ShowHomeCommand
       {
          get { 
              return new RelayCommand( 
                o => ShowUserControl, 
                o => {return Home != Visibility.Visible;}
              );
          }
       }
       private void ShowUserControl()
       {
          Home = Visibility.Visible;
       }
    }

XAML:

<Window ... >
    <Window.DataContext>
        <vm:homeViewModel />
    </Window.DataContext>
    <StackPanel>
        <Button Content="Show Home" Command="{Binding ShowHomeCommand}" />
        <Button Content="Collapse Home" Command="{Binding HideHomeCommand}" />
        <views:home Visibility="{Binding Home }" /> 
        <!-- home is an usercontrol -->
    </StackPanel>
</Window>

1 个答案:

答案 0 :(得分:2)

由于您将可见性Home<views:home Visibility="{Binding Home}"/>绑定在一起,因此您应该使用:

PropertyChanged(this, new PropertyChangedEventArgs("Home"));

这样就可以为Home属性调用属性更改事件。此外,_myHome无需成为财产。它应该是一个简单的私人领域。

有一个名为PropertyChanged.Fody的库可以自动处理所有这些属性更改的事件,您可能需要查看它。

如果您想手动处理PropertyChanged事件而您正在使用C#6.0(Visual Studio 2015),则可能需要使用:

PropertyChanged(this, new PropertyChangedEventArgs(nameof(Home)));

使用以前的代码,如果重命名Home属性并忘记更改PropertyChanged事件中的字符串,它将无声地通知。但是使用此代码,编译将失败,您将不得不修复它。