wpf - 样式数据触发器在设计时工作,但在运行时不工作 - 为什么?

标签 wpf datatrigger wpf-style

(在有人问之前,标题是正确的:我的代码仅在 Blend 中的设计时间工作,而迄今为止最常见的是相反的:o)

在 Expression Blend 中设计 DataTemplate 时,我可以看到我的 DataTriggers 工作正常,我的示例 ViewModel 生成电池电量的随机值,并且两个边框宽度和背景颜色会相应地显示在 BatteryLevelTemplate 本身中,以及另一个包含许多设备及其各自(随机)电池电量和设计时 DataContext 的面板中。

这是 Expression Blend 的屏幕截图:

enter image description here

这是正在运行的应用程序的屏幕截图。请注意,虽然两者都使用与 DataContext 完全相同的类(但在 Blend 中设计时),但在运行时仅应用默认的 RedBattery 颜色 setter ,即使值本身(也会影响宽度)发生变化:

enter image description here

以下是相关代码部分:

                    <Border.Width>
                        <MultiBinding Converter="{StaticResource NormalValueConverter}" FallbackValue="10">
                            <Binding Path="NívelBateria"/>
                            <Binding Path="ActualWidth" ElementName="BatteryChargeContainer"/>
                        </MultiBinding>
                    </Border.Width>
                    <Border.Style>
                        <Style TargetType="Border">
                            <Setter Property="Background">
                                <Setter.Value>
                                    <SolidColorBrush Color="{StaticResource BatteryRed}"/>
                                </Setter.Value>
                            </Setter>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding NívelBateria, Converter={StaticResource ValorMaiorQue}, ConverterParameter=0.25}" Value="True">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{StaticResource BatteryOrange}"/>
                                        </Setter.Value>
                                    </Setter>                                       
                                </DataTrigger>
                                <DataTrigger Binding="{Binding NívelBateria, Converter={StaticResource ValorMaiorQue}, ConverterParameter=0.5}" Value="True">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{StaticResource BatteryYellow}"/>
                                        </Setter.Value>
                                    </Setter>                                       
                                </DataTrigger>
                                <DataTrigger Binding="{Binding NívelBateria, Converter={StaticResource ValorMaiorQue}, ConverterParameter=0.75}" Value="True">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{StaticResource BatteryGreen}"/>
                                        </Setter.Value>
                                    </Setter>                                       
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>

============

        <DockPanel x:Name="PainelSetupsSensores" Background="#FFB8E6E8"/>
        <DockPanel x:Name="PainelSensoresDisponiveis" Background="#FFF0F0F0"
            Grid.RowSpan="2" Grid.Column="1" 
            DataContext="{Binding ReceiverAtivo}"
            d:DataContext="{d:DesignInstance Type=local:ReceiverSimulado, IsDesignTimeCreatable=True}">
            <ScrollViewer>
                <ItemsControl  ItemsSource="{Binding Sensores}" Margin="10">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </ScrollViewer>
        </DockPanel>

====================

class ValorMaiorQue : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double valor = (double)value;
        double limite = double.Parse((string)parameter);

        return valor > limite;
    }

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

更新(使用 Contango 有值(value)的 Snoop 提示):

我“窥探”了BatteryCharge(边框)元素,并发现了一个有趣的事情:

  • 受多值元素绑定(bind)影响的 Width 属性工作正常并显示在“本地”绿色阴影行中;
  • 另一方面,Background 属性不起作用,毫不奇怪地显示为具有默认红色值的 Style。这不是“DataTriggered”。

enter image description here

我现在的疑问是我应该如何使用 Snoop(或其他任何东西)来找出 DataTrigger 没有被应用的原因。

最佳答案

我“无意中”发现了这个问题,解释如下:

  1. 我安装了 Snoop,TriggerTracing还有 WPF Inspector 检查我的 DataTriggers 应用的属性,并发现 DataConverter 提供的比较始终为 False;
  2. 然后,我在 DataConverter 中放置了一个断点,例如,发现 ConverterParameter 提供的字符串“0.75”被 Double.Parsed 为 75.0;
  3. 然后我意识到我当前的语言是 pt-BR,小数点分隔符是逗号而不是点。然后我更改了转换器,向 Double.Parse 添加了 InvariantCulture 参数。现在它可以工作了!

    double limite = double.Parse((string)parameter, CultureInfo.InvariantCulture);

关于wpf - 样式数据触发器在设计时工作,但在运行时不工作 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405649/

相关文章:

应用程序资源中的 WPF 样式

c# - WPF 中是否有等效的 MessageBox?

c# - 打印多页xaml控件

WPF DataTrigger 找不到触发器目标

DataGrid 的 WPF Datatrigger 仅更改整行

c# - 从附加属性设置样式中的 WPF MenuItem 图标

C# .NET4 WPF - 从字符串中设置组合框选择项

.net - Fody 插件 Validar 失败。无法从程序集 mscorlib 加载类型 'Validar.ValidationTemplateAttribute'

.net - 如何使用 DataTrigger 覆盖绑定(bind)属性

xaml - 如何在 XAML 中调用 ResourceDictionary 文件中的样式?