9

原則として、RadioButtons をほぼすべてのものにバインドするための巧妙な方法を開発しました。

/// <summary>Converts an value to 'true' if it matches the 'To' property.</summary>
/// <example>
/// <RadioButton IsChecked="{Binding VersionString, Converter={local:TrueWhenEqual To='1.0'}}"/>
/// </example>
public class TrueWhenEqual : MarkupExtension, IValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object To { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return object.Equals(value, To);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((bool)value) return To;
        throw new NotSupportedException();
    }
}

たとえば、これを使用して、次のように RadioButton を文字列プロパティにバインドできます (RadioButton ごとに一意の GroupName を使用する必要があるのはよく知られたバグです)。

<RadioButton GroupName="G1" Content="Cat"
    IsChecked="{Binding Animal, Converter={local:TrueWhenEqual To='CAT'}}"/>
<RadioButton GroupName="G2" Content="Dog"
    IsChecked="{Binding Animal, Converter={local:TrueWhenEqual To='DOG'}}"/>
<RadioButton GroupName="G3" Content="Horse"
    IsChecked="{Binding Animal, Converter={local:TrueWhenEqual To='HORSE'}}"/>

ここで、 andpublic static readonlyというオブジェクトを RadioButton の値として使用したいと思います。だから私は試しました:Filter1Filter2

<RadioButton GroupName="F1" Content="Filter Number One"
    IsChecked="{Binding Filter, Converter={local:TrueWhenEqual To='{x:Static local:ViewModelClass.Filter1}'}}"/>
<RadioButton GroupName="F2" Content="Filter Number Two"
    IsChecked="{Binding Filter, Converter={local:TrueWhenEqual To='{x:Static local:ViewModelClass.Filter2}'}}"/>

しかし、これは私にエラーを与えます:

マークアップ拡張機能の解析中に、タイプ 'MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension' の不明なプロパティ 'To' が検出されました。

引用符を削除してもエラーが発生します。私は何を間違っていますか?

4

3 に答える 3

9

これは、ネストされた MarkupExtensions で発生するバグです。カスタム マークアップを別の DLL/プロジェクトに入れるか、プロパティ要素の構文を使用してみてください。

于 2012-08-02T20:50:40.610 に答える
6

WPF は、ネストされたマークアップ拡張機能をうまく処理できません。これを克服するために、マークアップ拡張機能を要素として使用できます。少し不器用で読みにくいですが、機能します:

<RadioButton GroupName="F1" Content="Filter Number One">
    <RadioButton.IsChecked>
        <Binding Path="Filter">
            <Binding.Converter>
                <local:TrueWhenEqual To={x:Static local:ViewModelClass.Filter1} />
            </Binding.Converter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>

もう 1 つの方法は、コンバーターを宣言し、それを静的リソースとして使用することです。

<Window.Resources>
    <local:TrueWhenEqual To={x:Static local:ViewModelClass.Filter1} x:Key="myConverter" />
</Window.Resources>

<RadioButton GroupName="F1" Content="Filter Number One"
             IsChecked="{Binding Filter, Converter={StaticResource myConverter}}" />
于 2012-08-02T21:04:40.503 に答える