[wpf] 정수를 ConverterParameter로 전달하는 방법은 무엇입니까?

정수 속성에 바인딩하려고합니다.

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter=0}" />

내 변환기는 다음과 같습니다.

[ValueConversion(typeof(int), typeof(bool))]
public class IntToBoolConverter : IValueConverter
{
    public object Convert(object value, Type t, object parameter, CultureInfo culture)
    {
        return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
    {
        return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
    }
}

문제는 내 변환기가 호출 될 때 매개 변수가 문자열이라는 것입니다. 정수가 필요합니다. 물론 문자열을 구문 분석 할 수 있지만 그래야합니까?

도움을 주셔서 감사합니다 konstantin



답변

여기 요!

<RadioButton Content="None"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <RadioButton.IsChecked>
        <Binding Path="MyProperty"
                 Converter="{StaticResource IntToBoolConverter}">
            <Binding.ConverterParameter>
                <sys:Int32>0</sys:Int32>
            </Binding.ConverterParameter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>

트릭은 기본 시스템 유형에 대한 네임 스페이스를 포함시킨 다음 적어도 ConverterParameter 바인딩을 요소 형식으로 작성하는 것입니다.


답변

완전성을 위해 가능한 한 가지 해결책이 더 있습니다.

<Window
    xmlns:sys="clr-namespace:System;assembly=mscorlib" ...>
    <Window.Resources>
        <sys:Int32 x:Key="IntZero">0</sys:Int32>
    </Window.Resources>

    <RadioButton Content="None"
                 IsChecked="{Binding MyProperty,
                                     Converter={StaticResource IntToBoolConverter},
                                     ConverterParameter={StaticResource IntZero}}" />

(물론, Window로 대체 할 수 있습니다 UserControl, 그리고 IntZero가까운 실제 사용의 장소로 정의 할 수 있습니다.)


답변

확실하지 왜 WPF사람들은 사용으로 꺼렸되는 경향이있다 MarkupExtension. 여기에 언급 된 문제를 포함하여 많은 문제에 대한 완벽한 솔루션입니다.

public sealed class Int32Extension : MarkupExtension
{
    public Int32Extension(int value) { this.Value = value; }
    public int Value { get; set; }
    public override Object ProvideValue(IServiceProvider sp) { return Value; }
};

이 태그 확장을 XAML네임 스페이스 ‘m’ 에서 사용할 수있는 경우 원본 포스터의 예는 다음과 같습니다.

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter={m:Int32 0}}" />

이는 태그 확장 파서가 생성자 인수의 강력한 유형을 확인하고 그에 따라 변환 할 수있는 반면 Binding의 ConverterParameter 인수는 정보가 부족한 객체 유형이기 때문에 작동합니다.


답변

사용하지 마십시오 value.Equals. 사용하다:

  Convert.ToInt32(value) == Convert.ToInt32(parameter)


답변

XAML에서 ConverterValue에 대한 형식 정보를 어떻게 든 표현하는 것이 좋지만 지금은 가능하지 않다고 생각합니다. 따라서 일부 사용자 지정 논리에 의해 예상 유형으로 Converter 개체를 구문 분석해야한다고 생각합니다. 나는 다른 길을 보지 못한다.


답변