网格上的可见性绑定不起作用
Visibility binding on grid not working
我正在尝试绑定网格的可见性但无法这样做。
//ViewModel Class
private Visibility _isVisiblePane = Visibility.Hidden;
public Visibility isVisiblePane {
get
{
return _isVisiblePane;
}
set
{
_isVisiblePane = value;
RaisePropertyChanged(() => "isVisiblePane");
}
}
//xaml code
<Grid Visibility="{Binding Path=isVisiblePane}">
....My Content....
</Grid>
调试时,程序将值设置为隐藏,但当我更改 _isVisiblePane 的可见性时,它不会更新 GUI 中的可见性(网格保持隐藏,而 _isVisiblePane 值可见)。
//in some function => on button click, value of _isVisiblePane updates to Visible but grid remains hidden.
isVisiblePane = isLastActiveDoc() == true ? Visibility.Visible : Visibility.Hidden;
错误!在 RaisePropertyChanged("isVisiblePane") 行。好像没有 属性 这个名字
"An exception of type 'System.ArgumentException' occurred in GalaSoft.MvvmLight.dll but was not handled in user code"
PS:我也尝试过使用 bool 的 IValueConverter 方法。仍然没有弄清楚问题出在哪里。有帮助吗?
没有真正回答,但是:
- 恕我直言,您不应该在 ViewModel 中使用 Visibility 枚举。看,ViewModels 应该与视图技术本身无关(例如,意识到 INotifyPropertyChanged 不是 WPF 库的一部分)。因此,改为绑定到布尔值并使用 converter.
- .NET 中的公共属性通常遵循 Pascal 大小写,因此,我建议将
isVisiblePane
更改为 IsPaneVisible
。
- 仔细检查您的视图的 DataContext。
- 运行 项目处于调试模式并观察控制台以获取有关绑定的消息。
- 确保您的 ViewModel class 实现了 INotifyPropertyChanged。
确保 RaisePropertyChanged 最终在正确的线程上下文中调用 PropertyChanged 如果您的视图也是您的 UI。
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(String info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
确保网格将您的虚拟机作为其数据上下文,或者为您的绑定指定正确的源。
确保 RaisePropertyChanged 通过
绑定了任何东西
if(RaisePropertyChanged != null)
RaisePropertyChanged (....)
w=10=sh
w=13=SHI.e. w=12=st
w=11=sh
我正在尝试绑定网格的可见性但无法这样做。
//ViewModel Class
private Visibility _isVisiblePane = Visibility.Hidden;
public Visibility isVisiblePane {
get
{
return _isVisiblePane;
}
set
{
_isVisiblePane = value;
RaisePropertyChanged(() => "isVisiblePane");
}
}
//xaml code
<Grid Visibility="{Binding Path=isVisiblePane}">
....My Content....
</Grid>
调试时,程序将值设置为隐藏,但当我更改 _isVisiblePane 的可见性时,它不会更新 GUI 中的可见性(网格保持隐藏,而 _isVisiblePane 值可见)。
//in some function => on button click, value of _isVisiblePane updates to Visible but grid remains hidden.
isVisiblePane = isLastActiveDoc() == true ? Visibility.Visible : Visibility.Hidden;
错误!在 RaisePropertyChanged("isVisiblePane") 行。好像没有 属性 这个名字 "An exception of type 'System.ArgumentException' occurred in GalaSoft.MvvmLight.dll but was not handled in user code"
PS:我也尝试过使用 bool 的 IValueConverter 方法。仍然没有弄清楚问题出在哪里。有帮助吗?
没有真正回答,但是:
- 恕我直言,您不应该在 ViewModel 中使用 Visibility 枚举。看,ViewModels 应该与视图技术本身无关(例如,意识到 INotifyPropertyChanged 不是 WPF 库的一部分)。因此,改为绑定到布尔值并使用 converter.
- .NET 中的公共属性通常遵循 Pascal 大小写,因此,我建议将
isVisiblePane
更改为IsPaneVisible
。 - 仔细检查您的视图的 DataContext。
- 运行 项目处于调试模式并观察控制台以获取有关绑定的消息。
- 确保您的 ViewModel class 实现了 INotifyPropertyChanged。
确保 RaisePropertyChanged 最终在正确的线程上下文中调用 PropertyChanged 如果您的视图也是您的 UI。
public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(String info) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(info)); }
确保网格将您的虚拟机作为其数据上下文,或者为您的绑定指定正确的源。
确保 RaisePropertyChanged 通过
绑定了任何东西if(RaisePropertyChanged != null) RaisePropertyChanged (....)