C# 通过PropertyChangedEvent更改UserControl的可见性
更新:完整工作示例: 我正在使用属性绑定更改窗口中usercontrol的可见性。随着INotifyPropertyChanged的更改,我通知UI进行更新 我正在使用RelayCommand实现 C# XAML:C# 通过PropertyChangedEvent更改UserControl的可见性,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,更新:完整工作示例: 我正在使用属性绑定更改窗口中usercontrol的可见性。随着INotifyPropertyChanged的更改,我通知UI进行更新 我正在使用RelayCommand实现 C# XAML: 既然您将可见性主页与绑定,您应该使用: PropertyChanged(这是新的PropertyChangedEventArgs(“主页”) 通过这种方式,您可以为Home属性调用属性更改事件。此外,\u myHome也不需要成为一个属性。它应该是一个简单的私有字段 有一个名为的库,
既然您将可见性
主页
与
绑定,您应该使用:
PropertyChanged(这是新的PropertyChangedEventArgs(“主页”)代码>
通过这种方式,您可以为Home
属性调用属性更改事件。此外,\u myHome
也不需要成为一个属性。它应该是一个简单的私有字段
有一个名为的库,它自动处理所有这些属性更改事件,您可能需要查看它
如果您想手动处理属性更改
事件,并且正在使用C#6.0(Visual Studio 2015),您可能需要使用:
PropertyChanged(这是新的propertychangedventargs(nameof(Home))代码>
使用上一个代码如果重命名Home
属性并忘记更改PropertyChanged
事件中的字符串,它将以静默方式通知失败。但是使用此代码,编译将失败,您必须修复它。因为您将可见性主页
与
绑定,所以您应该使用:
PropertyChanged(这是新的PropertyChangedEventArgs(“主页”)代码>
通过这种方式,您可以为Home
属性调用属性更改事件。此外,\u myHome
也不需要成为一个属性。它应该是一个简单的私有字段
有一个名为的库,它自动处理所有这些属性更改事件,您可能需要查看它
如果您想手动处理属性更改
事件,并且正在使用C#6.0(Visual Studio 2015),您可能需要使用:
PropertyChanged(这是新的propertychangedventargs(nameof(Home))代码>
使用上一个代码如果重命名Home
属性并忘记更改PropertyChanged
事件中的字符串,它将以静默方式通知失败。但是有了这段代码,编译将失败,您必须修复它。您是对的_我的家应该是私人的。我有一个问题,我需要一个定制的主页设置器(发送通知),但如果我在getter of home中返回主页,我会得到一个Innity循环(表示vs),因此我有第二个_myHome。是的,这就是使用它的方式。只有\u myHome
不需要是属性。您可以将其定义为private Visibility\u myHome代码>是。福迪是个很棒的图书馆。我极力推荐它。我也可以推荐使用WPF inspector。它是一个独立的应用程序,允许您将其附加到调试应用程序,并检查其中的所有内容。更新inspector中的值,并观察它在UI中的更新。使检测未绑定元素或错误绑定模式更容易。谢谢,我更改了代码和问题。但这并不能解决我的问题。谁能解释这个问题我会和WPF Inspector一起检查我的应用程序,并给你反馈。这个问题还有很多。使用您提供的代码,我可以成功地折叠并显示控件。请提供实际的代码,这样我就可以看到什么是错误的。你是对的_我的家应该是私人的。我有一个问题,我需要一个定制的主页设置器(发送通知),但如果我在getter of home中返回主页,我会得到一个Innity循环(表示vs),因此我有第二个_myHome。是的,这就是使用它的方式。只有\u myHome
不需要是属性。您可以将其定义为private Visibility\u myHome代码>是。福迪是个很棒的图书馆。我极力推荐它。我也可以推荐使用WPF inspector。它是一个独立的应用程序,允许您将其附加到调试应用程序,并检查其中的所有内容。更新inspector中的值,并观察它在UI中的更新。使检测未绑定元素或错误绑定模式更容易。谢谢,我更改了代码和问题。但这并不能解决我的问题。谁能解释这个问题我会和WPF Inspector一起检查我的应用程序,并给你反馈。这个问题还有很多。使用您提供的代码,我可以成功地折叠并显示控件。请提供实际的代码,以便我可以看到什么是错误的。
//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;
}
}
<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>