WPF MVVM中DataTrigger失效求助:是否与Command Binding有关?
问题分析与解决
别担心,刚上手WPF的DataTrigger踩点小坑太正常了~你的问题和Command Binding完全没关系,这俩是独立的机制,不会互相干扰。我帮你排查两个最可能的原因:
1. Style里Setter的属性写法冗余(小问题)
你在DataTrigger的Setter里写了Control.Background,但你的Style已经指定了TargetType="Button",直接写Background就够了,多余的Control.前缀虽然不一定报错,但属于不规范写法,偶尔会导致属性匹配异常。把它改成Background就好。
2. ViewModel的LoggedOn属性没通知UI更新(核心问题)
这是触发器失效最常见的原因:如果你的ViewModel没有实现INotifyPropertyChanged接口,当LoggedOn的值从False变成True(或者反过来)时,UI根本接收不到属性变化的通知,自然不会触发DataTrigger的样式切换。
修复后的XAML代码
<Button x:Name="logOnButton" HorizontalAlignment="Left" Margin="369,70,0,0" VerticalAlignment="Top" Width="75" IsEnabled="True" Command="{Binding LogonButtonClick}"> <Button.Style> <Style TargetType="Button"> <Setter Property="Background" Value="Red"/> <Setter Property="Content" Value="Log On"/> <Style.Triggers> <DataTrigger Binding="{Binding LoggedOn}" Value="True"> <Setter Property="Background" Value="Green"/> <Setter Property="Content" Value="Log Off"/> </DataTrigger> <!-- 其实第二个DataTrigger可以去掉,Style里的Setter已经是默认值False的情况了 --> <DataTrigger Binding="{Binding LoggedOn}" Value="False"> <Setter Property="Background" Value="Red"/> <Setter Property="Content" Value="Log On"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style> </Button>
对应的ViewModel示例(必须实现INotifyPropertyChanged)
public class YourViewModel : INotifyPropertyChanged { private bool _loggedOn; public bool LoggedOn { get => _loggedOn; set { if (_loggedOn != value) { _loggedOn = value; OnPropertyChanged(nameof(LoggedOn)); } } } public ICommand LogonButtonClick { get; } public YourViewModel() { LogonButtonClick = new RelayCommand(() => { // 点击按钮时切换LoggedOn的值 LoggedOn = !LoggedOn; }); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
另外提个小优化:你其实不需要第二个Value="False"的DataTrigger,因为Style里的Setter已经是默认的Red背景和Log On文字了,当LoggedOn是False时,会自动用默认值,删掉第二个DataTrigger能让代码更简洁~
内容的提问来源于stack exchange,提问作者GKonheiser
相关产品推荐
相关产品推荐

