You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF C#:如何根据模型布尔属性修改DataGrid中按钮的文本与颜色

在WPF DataGrid中根据模型布尔属性修改按钮文本和颜色

方法一:纯XAML用DataTrigger实现

假设你的模型有布尔属性IsEncrypted(true代表已加密,false代表已解密),直接在按钮的样式里添加DataTrigger,就能根据属性值自动切换文本和颜色:

修改后的按钮XAML代码:

<Button Click="Decrypt_Click" Height="25" Margin="0,-10">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <!-- 默认样式:已加密状态,按钮文字蓝色 -->
            <Setter Property="Foreground" Value="#FF007ACC"/>
            <Style.Triggers>
                <!-- 当IsEncrypted为False时,切换为绿色 -->
                <DataTrigger Binding="{Binding IsEncrypted}" Value="False">
                    <Setter Property="Foreground" Value="#FF50C878"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
    <StackPanel Orientation="Horizontal">
        <materialDesign:PackIcon Kind="FileExport" />
        <TextBlock>
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Setter Property="Text" Value="Decrypt"/>
                    <Style.Triggers>
                        <!-- 属性为False时,文字改成Encrypt -->
                        <DataTrigger Binding="{Binding IsEncrypted}" Value="False">
                            <Setter Property="Text" Value="Encrypt"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>
</Button>

如果你的属性名不是IsEncrypted,直接替换成自己的属性名即可。

方法二:用IValueConverter实现(适合多场景复用)

如果需要在多个地方重复使用这个逻辑,写个值转换器更方便:

1. 写文本转换器类

public class EncryptDecryptTextConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is bool isEncrypted ? (isEncrypted ? "Decrypt" : "Encrypt") : "Decrypt";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

2. 写颜色转换器类

public class EncryptDecryptColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool isEncrypted)
        {
            var color = isEncrypted ? "#FF007ACC" : "#FF50C878";
            return new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
        }
        return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF007ACC"));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3. 在XAML里引用转换器

先在窗口/用户控件的资源里声明转换器(注意local是你的项目命名空间):

<Window.Resources>
    <local:EncryptDecryptTextConverter x:Key="TextConverter"/>
    <local:EncryptDecryptColorConverter x:Key="ColorConverter"/>
</Window.Resources>

然后修改按钮的绑定:

<Button Click="Decrypt_Click" Height="25" Margin="0,-10"
        Foreground="{Binding IsEncrypted, Converter={StaticResource ColorConverter}}">
    <StackPanel Orientation="Horizontal">
        <materialDesign:PackIcon Kind="FileExport" />
        <TextBlock Text="{Binding IsEncrypted, Converter={StaticResource TextConverter}}"/>
    </StackPanel>
</Button>

注意事项

不管用哪种方法,你的模型类必须实现INotifyPropertyChanged接口,这样当布尔属性值变化时,UI才会自动更新。示例模型类:

public class FileModel : INotifyPropertyChanged
{
    private bool _isEncrypted;
    public bool IsEncrypted
    {
        get => _isEncrypted;
        set
        {
            _isEncrypted = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

内容的提问来源于stack exchange,提问作者SWG.Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:42:22