C# 聆听XAML中的全局变量更改
我有一个全局变量,指示我的应用程序是否处于只读模式C# 聆听XAML中的全局变量更改,c#,wpf,xaml,mvvm,.net-4.6.1,C#,Wpf,Xaml,Mvvm,.net 4.6.1,我有一个全局变量,指示我的应用程序是否处于只读模式 public static class Global { public static event PropertyChangedEventHandler StaticPropertyChanged; private static void OnStaticPropertyChanged(string propertyName) { StaticPropertyChanged?.Invoke(null, n
public static class Global
{
public static event PropertyChangedEventHandler StaticPropertyChanged;
private static void OnStaticPropertyChanged(string propertyName)
{
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}
private static bool _isReadOnly = false;
public static bool IsReadOnly
{
get { return _isReadOnly; }
set
{
_isReadOnly = value;
OnStaticPropertyChanged("IsReadOnly");
}
}
}
现在,我想在我所有的GUI中听一下,以关闭编辑。例如,我有一个DataGrid
<UserControl xmlns:models="clr-namespace:MyApp.Models" >
<DataGrid IsReadOnly="{Binding Path=(models:Global.IsReadOnly)}" />
</UserControl>
如何在ViewModel中侦听全局变量而不是局部变量?目前我收到了错误消息
名称空间模型中不存在全局名称
但确实如此!我已经尝试过重新编译并重新启动VS.而不是使用静态属性,您可以使用单例实现。您有一个实例,可以实现
INotifyPropertyChanged
:
public class Global : INotifyPropertyChanged
{
private Global() { }
public Global Instance { get; } = new Global();
private bool _isReadOnly;
public bool IsReadOnly
{
get => _isReadOnly;
set
{
if (_isReadOnly != value)
{
_isReadOnly = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(IsReadOnly)));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
然后你可以像这样使用它:
<DataGrid IsReadOnly="{Binding Source={x:Static local:Global.Instance}, Path=IsReadOnly}" />
这不适用于我已经打开和初始化的GUI。他们似乎没有重新加载属性。什么东西不适合StaticPropertyChanged方法?您是否使用4.5之前的WPF版本?请共享您的代码。您确定
Global
实际上是MyApp.Models
命名空间的成员吗?我已将您的代码粘贴到新的WPF项目中,它可以正常工作。不知道你这边出了什么问题。@Clemens:找到了。命名空间是正确的,但该类位于另一个程序集中。将其更改为xmlns:models=“clr namespace:MyApp.models;assembly=MyAppInterfaces”
起作用。由于WPF 4.5不再需要,因为您可以声明一个StaticPropertyChanged
事件,该事件由WPF绑定使用。谢谢,我不知道这个:)
public static event PropertyChangedEventHandler StaticPropertyChanged;