简短版本:
WPF 似乎总是IValueConverter
在绑定中使用时设置一个本地值,即使该转换器返回Binding.DoNothing
.
我的问题是:我必须返回或做什么来告诉 WPF 使用继承的值?
请注意:我不想使用 DataTriggers,因为这会使我的代码显着膨胀,因为我需要一个数据触发器和一个转换器来处理当前转换器返回的每种颜色。
带复制的长版:
想象一下以下场景:
我有一个Button
a 位于其中TextBlock
。存在Button
设置Foreground
属性的样式。此值由TextBlock
. 现在我想创建一个值转换器,将 a 的值转换TextBlock
为Brush
用作Foreground
- 但仅在某些情况下。在我不想设置特殊颜色的情况下,我返回Binding.DoNothing
. 我的理解是,这将使TextBlock
继续使用继承的值。
不幸的是,我的理解并不正确。即使Binding.DoNothing
设置了返回本地值。这已通过 Snoop 进行了验证。
这个简单的例子可以很容易地重现这个问题:
XAML:
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<WpfApplication1:DummyConverter x:Key="DummyConverter" />
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Red" />
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground"
Value="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource DummyConverter}}" />
</Style>
</Window.Resources>
<StackPanel>
<Button><TextBlock>Text1</TextBlock></Button>
<Button><TextBlock>Text2</TextBlock></Button>
</StackPanel>
</Window>
转换器:
public class DummyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ToString() == "Text2")
return Brushes.Cyan;
return Binding.DoNothing;
}
}
如您所见,第一个按钮的文本是黑色而不是红色。如果您删除TextBlock
两个按钮的样式,则会有正确的红色文本。
问题:
我必须做些什么来防止这种情况发生?是否有一些返回值告诉引擎继续使用继承的值?