C# 根据显示的文本触发颜色更改的更好方法 我有一个struct类,它记录一个值和一个检查,它只是简单地说它是好是坏 我想创建一个TextBlock,当值为“Bad”时,其背景变为红色。这就是我目前在用户控件的XAML中所做的 因此,这里发生的事情是,我正在通过将显示的TextBlock绑定到折叠的TextBlock来更改Background的颜色,在这种情况下,我以以下方式绑定viewModel中的StressCheck值

C# 根据显示的文本触发颜色更改的更好方法 我有一个struct类,它记录一个值和一个检查,它只是简单地说它是好是坏 我想创建一个TextBlock,当值为“Bad”时,其背景变为红色。这就是我目前在用户控件的XAML中所做的 因此,这里发生的事情是,我正在通过将显示的TextBlock绑定到折叠的TextBlock来更改Background的颜色,在这种情况下,我以以下方式绑定viewModel中的StressCheck值,c#,wpf,textblock,dependencyobject,C#,Wpf,Textblock,Dependencyobject,在XAML中 <UserControl x:Class="ScienceProgram.Views.TestView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

在XAML中

<UserControl x:Class="ScienceProgram.Views.TestView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ScienceProgram.Views"
             xmlns:uc="clr-namespace:ScienceProgram.UserControls"
             mc:Ignorable="d" 
             d:DesignHeight="1200" d:DesignWidth="811">
    <Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="65"/>
        </Grid.RowDefinitions>
        <StackPanel>
            <uc:DataCellCheck Value="{Binding Path=DisplayStressValue }" Check="{Binding Path=DisplayStressCheck}"/>
        </StackPanel>
    </Grid>
</UserControl>

  • 现在,我的问题是,有没有更好的方法触发显示的文本块中的颜色更改,而不必绑定
    StressCheck
    并将其隐藏在另一个文本块中
  • 非常感谢

    是否有更好的方法触发显示的文本块中的颜色更改,而不必绑定Stress Check并将其隐藏在另一个文本块中

    我希望如此。你现在做这件事的方式很笨拙

    如果没有,就不可能确认这在您的具体场景中是否有效,但它应该是这样的。您可以只绑定到触发器中的
    Check
    属性,而不是另一个
    TextBlock

    
    
    值得一提的是,我更喜欢为一个值包含一个setter,并为另一个值使用触发器(如果有多个值,则使用其他触发器):

    
    
    无论哪种方式,WPF都隐式处理
    enum
    类型,将提供的文本值解析为实际的enum值,并将其用于触发器的比较。您不需要额外的
    TextBlock
    或其他机制(如转换器)在放入XAML的文本和实际的
    enum
    值之间进行转换

    如果上述内容不能解决您的问题,请通过提供良好的MCVE来改进问题,以便能够理解您的场景的完整背景

    是否有更好的方法触发显示的文本块中的颜色更改,而不必绑定Stress Check并将其隐藏在另一个文本块中

    我希望如此。你现在做这件事的方式很笨拙

    如果没有,就不可能确认这在您的具体场景中是否有效,但它应该是这样的。您可以只绑定到触发器中的
    Check
    属性,而不是另一个
    TextBlock

    
    
    值得一提的是,我更喜欢为一个值包含一个setter,并为另一个值使用触发器(如果有多个值,则使用其他触发器):

    
    
    无论哪种方式,WPF都隐式处理
    enum
    类型,将提供的文本值解析为实际的enum值,并将其用于触发器的比较。您不需要额外的
    TextBlock
    或其他机制(如转换器)在放入XAML的文本和实际的
    enum
    值之间进行转换


    如果上述内容不能解决您的问题,请提供一个好的MCVE来改进问题,以便了解您的场景的完整背景。

    对不起。我真的不能投票,因为我没有足够的分数。在我把你的回答标记为答案之前,我希望从其他人那里得到不同的答案。但是,我想我不会得到更多的答案了,因为我的问题是基本的。不管怎样,给你!谢谢你。我真的不能投票,因为我没有足够的分数。在我把你的回答标记为答案之前,我希望从其他人那里得到不同的答案。但是,我想我不会得到更多的答案了,因为我的问题是基本的。不管怎样,给你!谢谢
    <UserControl x:Class="ScienceProgram.UserControls.DataCellCheck"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 x:Name="parent">
        <UserControl.Resources>
            <Style x:Key="CheckStress" TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=TB,Path=Text}" Value="Good">
                        <Setter Property="Background" Value="Green" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=TB,Path=Text}" Value="Bad">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </UserControl.Resources>
        <Grid Margin="1" DataContext="{Binding ElementName=parent}" Width="100">
            <TextBlock Style="{StaticResource CheckStress}" Text="{Binding Path=Value}" />
            <TextBlock x:Name="TB"  Text="{Binding Path=Check}" Visibility="Collapsed"/>
        </Grid>
    
        public partial class DataCellCheck : UserControl
        {
            public DataCellCheck()
            {
                InitializeComponent();
            }
    
            public static readonly DependencyProperty ValueProp = 
                DependencyProperty.Register("Value", typeof(string), 
                    typeof(DataCellCheck), new PropertyMetadata(""));
    
            public string Value
            {
                get { return GetValue(ValueProp) as String; }
                set { SetValue(ValueProp, value); }
            }
    
            public static readonly DependencyProperty StatusProp = 
                DependencyProperty.Register("Check", typeof(string), 
                    typeof(DataCellCheck), new PropertyMetadata(""));
    
            public string Check
            {
                get { return GetValue(StatusProp) as String; }
                set { SetValue(StatusProp, value); }
            }
        }
    
        public class TestViewModel : BindableBase
        {
            public Stress MyFirstStress { get; set; }
    
            public TestViewModel()
            {
                MyFirstStress = new Stress(1245, StressCheck.Fail);
            }
    
            public double DisplayStressValue => MyFirstStress.StressValue;
            public string DisplayStressCheck => MyFirstStress.Check.ToString();
        }
            
    
    <UserControl x:Class="ScienceProgram.Views.TestView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:ScienceProgram.Views"
                 xmlns:uc="clr-namespace:ScienceProgram.UserControls"
                 mc:Ignorable="d" 
                 d:DesignHeight="1200" d:DesignWidth="811">
        <Grid Margin="5">
            <Grid.RowDefinitions>
                <RowDefinition Height="65"/>
            </Grid.RowDefinitions>
            <StackPanel>
                <uc:DataCellCheck Value="{Binding Path=DisplayStressValue }" Check="{Binding Path=DisplayStressCheck}"/>
            </StackPanel>
        </Grid>
    </UserControl>