短いバージョン: WPF は、コンバーターが を返す場合でも、バインドで
を使用する場合、常にローカル値を設定するようです。
私の質問は次のとおりです。継承された値を使用するように WPF に指示するには、何を返すか、何をする必要がありますか?IValueConverter
Binding.DoNothing
注: DataTriggers を使用したくないのは、現在のコンバーターが返すすべての色に対してコンバーターと共に 1 つのデータ トリガーが必要になるため、コードが大幅に肥大化するためです。
再生付きのロングバージョン:
次のシナリオを想像してください:
aが配置Button
されているTextBlock
があります。Button
プロパティを設定する のスタイルが存在しForeground
ます。この値は によって継承されますTextBlock
。TextBlock
ここで、の値を aBrush
に変換して - として使用する値コンバーターを作成したいと考えていますが、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
両方のボタンのスタイルを削除すると、正しい赤いテキストが表示されます。
質問:
これを防ぐにはどうすればよいですか? 継承された値を引き続き使用するようにエンジンに指示する、返す値はありますか?