.net 从控件更改控件可见性时出现问题
在我的应用程序中,我有一个stackpanel,我想隐藏它(或者折叠起来,在需要之前不让它出现),当用户点击一个按钮时,它就会变得可见 使用我对MVVM技术的基本知识,我遇到的问题是将stackpanel的可见性绑定到viewmodel中的属性。属性是可见性类型,按钮使用自定义命令,利用ICommand界面调用my viewmodel中的方法,在本阶段,该方法仅更改stackpanel绑定到的可见性属性的值 我已经确认命令本身正在成功调用该方法,并且visibility属性正在更改,但是我已将visibility属性绑定到的stackpanel拒绝变为可见 我将尝试构建一个我正在使用的代码的示例:.net 从控件更改控件可见性时出现问题,.net,wpf,mvvm,.net,Wpf,Mvvm,在我的应用程序中,我有一个stackpanel,我想隐藏它(或者折叠起来,在需要之前不让它出现),当用户点击一个按钮时,它就会变得可见 使用我对MVVM技术的基本知识,我遇到的问题是将stackpanel的可见性绑定到viewmodel中的属性。属性是可见性类型,按钮使用自定义命令,利用ICommand界面调用my viewmodel中的方法,在本阶段,该方法仅更改stackpanel绑定到的可见性属性的值 我已经确认命令本身正在成功调用该方法,并且visibility属性正在更改,但是我已将v
<Button Content="Show StackPanel" Command="{Binding Path=ShowPanelCommand}" />
<StackPanel Visibility="{Binding Path=panelVisibility}" />
我对C#/.NET和一般编程都是新手
我在很短的时间里学到了很多,但偶尔我也会遇到这样的困难
一些有指导的帮助对我来说是无价的
我愿意接受关于更好/更有效的方法的建议,以实现我在这个问题中概述的结果,但出于我的理解,我想知道我在尝试使用这种特殊方法时遗漏了什么或做错了什么
谢谢您的帮助。您需要做的是在您的
视图模型中实现:
public class YourViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public void ShowThePanel()
{
PanelVisibility = Visibility.Visible;
}
private Visibility panelVisibility;
public Visibility PanelVisibility
{
get
{
return panelVisibility
}
set
{
panelVisibility = value;
OnPropertyChanged("PanelVisibility");
}
}
}
然后在XAML
中:
<StackPanel Visibility="{Binding Path=PanelVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
编辑:
INotifyPropertyChanged接口用于通知客户端,
通常绑定客户端时,属性值已更改。对于
例如,考虑一个具有FieldNew属性的对象对象。到
提供通用属性更改通知,人员类型
实现INotifyPropertyChanged接口并引发
更改名字时发生的事件。对于要在中发生的更改通知
绑定客户端和数据源之间的绑定,您的绑定类型
应:
- 实现INotifyPropertyChanged接口(首选)李>
- 为绑定类型的每个属性提供更改事件李>
不要两者都做
假设您使用的是.net 4或更低版本,并且已经在viewModel基类中设置了INotifyPropertyChanged代码,并在panelVisibility属性的setter方法中调用它
INotifyPropertyChanged是一种允许绑定通知侦听控件需要更改的机制
示例基础视图模型
public class baseViewModel : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
这里还有一堆关于如何实现和调用iNotifyPropertyChanged接口的信息
.NET4.5略有不同。我没有使用4.5,因此无法对其进行反馈@Sandwich您需要一种方法来通知UI属性的值已更改,这只是一种方法(MVVM 101)。带有OnPropertyChanged(“PanelVisibility”)代码>在您的集合
下,它会将更改通知UI。使用自动属性时,不会将ViewModel中的任何更改通知UI。
public class baseViewModel : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}