在我的应用程序中,我有一个堆栈面板,我想保持隐藏(或折叠,无论是什么让它看不见,直到需要它),并在用户点击按钮时显示它。
使用我对MVVM技术的基本知识,我遇到的问题是将stackpanel的可见性绑定到我的viewmodel中的属性。该属性是一个Visibility类型,该按钮使用一个自定义命令,利用ICommand接口调用我的viewmodel中的方法,在此阶段,该方法只是改变了stackpanel绑定的visibility属性的值。
我已经确认命令本身已成功调用该方法,并且可见性属性IS正在更改,但我绑定了visibility属性的stackpanel拒绝变为可见。
我将尝试构建我正在使用的代码的说明性示例:
<Button Content="Show StackPanel" Command="{Binding Path=ShowPanelCommand}" />
<StackPanel Visibility="{Binding Path=panelVisibility}" />
在viewmodel中的Command调用的方法中:
public Visibility panelVisibility { get; set; }
public void ShowThePanel()
{
panelVisibility = Visibility.Visible;
}
我对C#/ .NET和一般编程都很陌生。
我在很短的时间内学到了很多东西,但偶尔我会像这样碰到一堵砖墙。
一些指导性的协助对我来说非常宝贵。
我愿意接受更好/更有效的技术建议来实现我在这个问题中概述的结果,但为了我理解的利益,我想知道我错过了什么或做错了什么试图用这种特殊的方式。
感谢您的帮助。
答案 0 :(得分:0)
您需要做的是在ViewModel
中实施INotifyPropertyChanged:
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接口用于通知客户端, 通常是绑定客户端,属性值已更改。对于 例如,考虑具有名为FirstName的属性的Person对象。至 提供通用属性更改通知,Person类型 实现INotifyPropertyChanged接口并引发一个 PropertyChanged 更改FirstName时的事件。用于在a中发生变更通知 绑定客户端和数据源之间的绑定,绑定类型 应该:
- 实现INotifyPropertyChanged接口(首选)。
- 为绑定类型的每个属性提供更改事件。
不要两者兼顾。
答案 1 :(得分:0)
假设您使用的是.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接口的信息 Implementing INotifyPropertyChanged - does a better way exist?
.net 4.5略有不同。我没有使用4.5,所以无法提供反馈