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


95

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

<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


2
바인딩에 대해 약간 다른 구문이있는 Windows Phone 플랫폼에서 이것을 달성하는 방법을 아는 사람이 있습니까? {Binding PROPERTY, Converter = {StaticResource MYCONVERTER}, ConverterParameter = INT_VAL}이 예에서 INT_VAL은 문자열로 전달됩니다
Krzysztof Kaczor

답변:


106

여기 요!

<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 바인딩을 요소 형식으로 작성하는 것입니다.


2
이것은 IValueConverter.Convert()"매개 변수" 매개 변수 유형이라는 사실을 변경하지 않습니다 object. 여전히 캐스팅 / 파싱해야합니다 ...
Dan J

6
@djacobson-참이지만 ValueConversion 속성을 사용하면 지정할 수 있습니다. 이것이 실제로 컴파일 타임이나 런타임에 사용되는지 확실하지 않습니다. 원래의 포스터 질문과 관련하여 그는 "정수 여야합니다. 물론 문자열을 구문 분석 할 수 있지만 그래야합니까?"라고 명시했습니다. 그래서 내 대답은 문자열 구문 분석이 없지만 정수의 unboxing 만 있다는 점에서 훨씬 더 안전하다는 점에서 완화됩니다.
jpierson

51

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

<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가까운 실제 사용의 장소로 정의 할 수 있습니다.)


44

확실하지 왜 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 인수는 정보가 부족한 객체 유형이기 때문에 작동합니다.


감사합니다. 유용했습니다. 첫 번째 XAML 확장이 될 것입니다. 그러나 나는 그것을 만들기 위해 더 나은 생각 Valueobject하기보다는 int그것을 각각의 시간을 권투 피하기 위해 ProvideValue. (그런 다음 private불법적 인 것을 직접 할당하지 않도록하십시오).
Zeus

1
@Zeus 일반적으로 ProvideValue마크 업 확장 인스턴스 당 한 번만 호출되므로 권투는 어쨌든 한 번만 발생해야합니다. 생성자에서 수행하지 않음으로써를 ProvideValue호출하지 않으면 권투를 아예 피합니다 . 제작에 관해서는 Value개인이의 마크 업 확장하여 배제 할 XAML개체 요소 구문 : msdn.microsoft.com/en-us/library/...을
글렌 Slayden

마지막 단락이 잘못되었습니다. 유형 변환이라고하며 속성에도 적용됩니다. 문제는 Binding.ConverterParameter특정 유형이 없으므로 object파서가 적용 할 변환을 알지 못하므로 모든 리터럴은 문자열로 처리됩니다.
HB

(따라서 확장에 기본 생성자가 있으면 {m:Int32 Value=0}마찬가지로 작동합니다.)
HB

5

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

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

8
왜 사용하고 싶지 value.Equals않습니까?
Zack

1

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.