gpt4 book ai didi

c# - 防止 IValueConverter 设置本地值

转载 作者:行者123 更新时间:2023-11-30 21:05:38 25 4
gpt4 key购买 nike

简短版:
在绑定(bind)中使用 IValueConverter 时,WPF 似乎总是设置本地值,即使该转换器返回 Binding.DoNothing
我的问题是:我必须返回什么或做什么才能告诉 WPF 使用继承的值?

请注意:我不想使用 DataTriggers,因为这会使我的代码显着膨胀,因为我需要一个数据触发器以及一个转换器来处理当前转换器返回的每种颜色。


带复制的长版:

想象一下以下场景:
我有一个 Button,其中有一个 TextBlockButton 存在一种设置 Foreground 属性的样式。此值由 TextBlock 继承。现在我想创建一个值转换器,将 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 的样式,这两个按钮将具有正确的红色文本。

问题:
我该怎么做才能防止这种情况发生?是否有一些要返回的值告诉引擎继续使用继承的值?

最佳答案

回答你的问题:根据this线程,不。一旦您为 TextBlock 提供样式 setter (#4),返回的任何值都将覆盖继承的属性(#7)。

相反,您可以像这样创建一个 MultiBinding:

public class DummyConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values[0].ToString() == "Text2")
return Brushes.Cyan;

return values[1];
}
}

<Window x:Class="Spritefire.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Spritefire"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:DummyConverter x:Key="DummyConverter" />
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Red" />
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource DummyConverter}">
<Binding Path="Text" RelativeSource="{RelativeSource Self}" />
<Binding Path="Foreground" ElementName="ExampleButton" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel>
<Button x:Name="ExampleButton">
<TextBlock>Text1</TextBlock>
</Button>
<Button>
<TextBlock>Text2</TextBlock>
</Button>
</StackPanel>
</Window>

关于c# - 防止 IValueConverter 设置本地值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com