(在有人问之前,标题是正确的:我的代码仅在 Blend 中的设计时间工作,而迄今为止最常见的是相反的:o)
在 Expression Blend 中设计 DataTemplate
时,我可以看到我的 DataTriggers
工作正常,我的示例 ViewModel 生成电池电量的随机值,并且两个边框宽度和背景颜色会相应地显示在 BatteryLevelTemplate
本身中,以及另一个包含许多设备及其各自(随机)电池电量和设计时 DataContext 的面板中。
这是 Expression Blend 的屏幕截图:
这是正在运行的应用程序的屏幕截图。请注意,虽然两者都使用与 DataContext 完全相同的类(但在 Blend 中设计时),但在运行时仅应用默认的 RedBattery 颜色 setter ,即使值本身(也会影响宽度)发生变化:
以下是相关代码部分:
<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”。
我现在的疑问是我应该如何使用 Snoop(或其他任何东西)来找出 DataTrigger 没有被应用的原因。
最佳答案
我“无意中”发现了这个问题,解释如下:
- 我安装了 Snoop,TriggerTracing还有 WPF Inspector 检查我的 DataTriggers 应用的属性,并发现 DataConverter 提供的比较始终为 False;
- 然后,我在 DataConverter 中放置了一个断点,例如,发现 ConverterParameter 提供的字符串“0.75”被 Double.Parsed 为 75.0;
然后我意识到我当前的语言是 pt-BR,小数点分隔符是逗号而不是点。然后我更改了转换器,向 Double.Parse 添加了 InvariantCulture 参数。现在它可以工作了!
double limite = double.Parse((string)parameter, CultureInfo.InvariantCulture);
关于wpf - 样式数据触发器在设计时工作,但在运行时不工作 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405649/