Button isEnabled 属性 与 Boolean 的绑定在 INotify属性Changed 触发时不会改变
Binding of Button isEnabled Property to a Boolean Does Not Change When INotifyPropertyChanged Fires
我一直在尝试将 Button 的 isEnabled 属性 成功绑定到布尔变量。更新布尔值后,按钮的启用状态不会改变。我使用 Microsoft 提供的有关此主题的有用文档来构建我的代码,找到了 here. Upon searching Whosebug, I came across this 篇关于类似问题的文章。它没有帮助我修复这个错误。
public class BackState : INotifyPropertyChanged
{
public bool _isEnabled;
public bool isEnabled
{
get
{
return _isEnabled;
}
set
{
if (value != _isEnabled)
{
_isEnabled = value;
NotifyPropertyChanged("isEnabled");
Debug.WriteLine("NotifyPropertyChanged was called successfully");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}
}
XAML 代码片段:
<Grid DataContext="{Binding BackObject}" HorizontalAlignment="Stretch" Height="250" VerticalAlignment="Top">
<Button x:FieldModifier="public" IsEnabled="{Binding isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="Back_Click" x:Name="Back" Foreground="DarkGray" Content="" FontFamily="Segoe MDL2 Assets" Background="#33FFFFFF" FontSize="20" Margin="40,70,0,133" />
</Grid>
我的布尔变换函数
public static void ChangeState(bool b)
{
BackState bs = new BackState();
if(b == true)
{
bs.isEnabled = true;
Debug.WriteLine("Enabled Property");
}else{
bs.isEnabled = false;
Debug.WriteLine("Disabled Property");
}
}
这里是 BackObject 定义
<local:BackState x:Key="BackObject"/>
在 GUI 中,该按钮始终保持启用状态。 (不管是否调用了ChangeState函数)应该根据调用的函数改变disable/enable。
在您的 ChangeState
方法中,您正在创建一个新的 BackState 对象,而这应该是 BackObject
上的 属性,您正在将其设置为 DataContext
。在 BackObject
上实例化一个 属性 的 BackState
,并绑定到该对象的 isEnabled
属性,以便告知 xaml监听 属性.
的变化
<Grid DataContext="{Binding BackObject}" HorizontalAlignment="Stretch" Height="250" VerticalAlignment="Top">
<Button x:FieldModifier="public" IsEnabled="{Binding yourPropertyWhcihIsBackState.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="Back_Click" x:Name="Back" Foreground="DarkGray" Content="" FontFamily="Segoe MDL2 Assets" Background="#33FFFFFF" FontSize="20" Margin="40,70,0,133" />
</Grid>
然后在方法中:
public static void ChangeState(bool b)
{
if(b == true)
{
yourPropertyWhcihIsBackState.isEnabled = true;
Debug.WriteLine("Enabled Property");
}else{
yourPropertyWhcihIsBackState.isEnabled = false;
Debug.WriteLine("Disabled Property");
}
}
但是,如果您最终要对未绑定 xaml 的对象实例进行更改,则此方法将不起作用。您似乎在 xaml 中创建了 BackObject
的新实例,但看起来您没有任何方法可以在代码中访问此对象。考虑设置一个 ViewModel
来完成这个。看看mvvm light,这是一个很棒的mvvm(模型视图视图模型)框架。
我一直在尝试将 Button 的 isEnabled 属性 成功绑定到布尔变量。更新布尔值后,按钮的启用状态不会改变。我使用 Microsoft 提供的有关此主题的有用文档来构建我的代码,找到了 here. Upon searching Whosebug, I came across this 篇关于类似问题的文章。它没有帮助我修复这个错误。
public class BackState : INotifyPropertyChanged
{
public bool _isEnabled;
public bool isEnabled
{
get
{
return _isEnabled;
}
set
{
if (value != _isEnabled)
{
_isEnabled = value;
NotifyPropertyChanged("isEnabled");
Debug.WriteLine("NotifyPropertyChanged was called successfully");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}
}
XAML 代码片段:
<Grid DataContext="{Binding BackObject}" HorizontalAlignment="Stretch" Height="250" VerticalAlignment="Top">
<Button x:FieldModifier="public" IsEnabled="{Binding isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="Back_Click" x:Name="Back" Foreground="DarkGray" Content="" FontFamily="Segoe MDL2 Assets" Background="#33FFFFFF" FontSize="20" Margin="40,70,0,133" />
</Grid>
我的布尔变换函数
public static void ChangeState(bool b)
{
BackState bs = new BackState();
if(b == true)
{
bs.isEnabled = true;
Debug.WriteLine("Enabled Property");
}else{
bs.isEnabled = false;
Debug.WriteLine("Disabled Property");
}
}
这里是 BackObject 定义
<local:BackState x:Key="BackObject"/>
在 GUI 中,该按钮始终保持启用状态。 (不管是否调用了ChangeState函数)应该根据调用的函数改变disable/enable。
在您的 ChangeState
方法中,您正在创建一个新的 BackState 对象,而这应该是 BackObject
上的 属性,您正在将其设置为 DataContext
。在 BackObject
上实例化一个 属性 的 BackState
,并绑定到该对象的 isEnabled
属性,以便告知 xaml监听 属性.
<Grid DataContext="{Binding BackObject}" HorizontalAlignment="Stretch" Height="250" VerticalAlignment="Top">
<Button x:FieldModifier="public" IsEnabled="{Binding yourPropertyWhcihIsBackState.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="Back_Click" x:Name="Back" Foreground="DarkGray" Content="" FontFamily="Segoe MDL2 Assets" Background="#33FFFFFF" FontSize="20" Margin="40,70,0,133" />
</Grid>
然后在方法中:
public static void ChangeState(bool b)
{
if(b == true)
{
yourPropertyWhcihIsBackState.isEnabled = true;
Debug.WriteLine("Enabled Property");
}else{
yourPropertyWhcihIsBackState.isEnabled = false;
Debug.WriteLine("Disabled Property");
}
}
但是,如果您最终要对未绑定 xaml 的对象实例进行更改,则此方法将不起作用。您似乎在 xaml 中创建了 BackObject
的新实例,但看起来您没有任何方法可以在代码中访问此对象。考虑设置一个 ViewModel
来完成这个。看看mvvm light,这是一个很棒的mvvm(模型视图视图模型)框架。