更新:完整的工作示例:
我正在使用属性绑定来更改窗口中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>
答案 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
事件中的字符串,它将无声地通知。但是使用此代码,编译将失败,您将不得不修复它。