2009-10-20 5 views
34

부울 값에 따라 표시/숨기기를 원하는 컨트롤이 있습니다.WPF : 1 바인딩에서 2 변환기를 사용하는 방법?

나는 NegatedBooleanConverter (false로 반전하고 그 반대로 전환 함)이 변환기를 먼저 실행해야합니다. 나는 BooleanToVisibilityConverter가 있고 NegatedBoolConverter 다음에이 변환기를 실행해야합니다.

이 문제를 어떻게 해결할 수 있습니까? XAML에서이 작업을 수행하려고합니다.

편집 : 작동하지 않는 것 this is a possible solution.

. 먼저 별도의 변환기를 사용하여 값을 변환 한 다음 변환 된 값을 사용하여 작업을 수행합니다.

은 내가해야 할 것은 :

  • (이 convertedValue 제공) 첫 컨버터 값을 변환합니다.
  • 변환 된 값을 두 번째 변환기로 변환하면이 결과가 필요합니다.
+0

네, 링크 된 솔루션은 아마도 최고 일 것입니다 ... –

+0

도 참조하십시오 [XAML에서 다중 변환기 연결하기] (http://stackoverflow.com/q/2607490/2032064) – Mifeet

+0

마을은 [여기] (http://stackoverflow.com/a/8326207/526704), 그의 솔루션은 jberger의 대답과 마찬가지로 원하는만큼 체인을 연결할 수있게 해줍니다.하지만이 코드는 더 우아하고 구현이 짧습니다. – DLeh

답변

0

ReversedBooleanToVisibilityConverter를 기본적으로 만들었으므로 기본적으로이 2 가지 작업을 한 단계 만 수행하면됩니다.

+0

예, 가능합니다. 솔루션을 선호하지만 휠 재발견없이 현재 컨버터를 재사용 할 수있는 솔루션을 선호합니다. 해당 솔루션이있는 경우 ... – Natrium

0

두 개의 변환기를 사용하는 대신 ConverterParameter (bool)를 사용하여 원래의 부울을 무효화할지 여부를 결정하는 자신의 BoolToVisibilityConverter를 작성할 수 있습니다.

+0

예, 가능한 해결책 일 수 있지만 휠을 다시 만들 필요없이 현재 변환기를 재사용 할 수있는 솔루션을 선호합니다. 해당 솔루션이 존재하는 경우 ... – Natrium

0

개인적으로 나는 전체 변환을 수행하는 1 개의 단일 변환기 만 만들 것입니다. 다른 장소에서 변환기가 절실히 필요하지 않으면 (부정 등) 변환이 한 곳에서 이루어지는 경우 유지 관리가 더 쉬워집니다.

+1

예, 가능한 해결책이 될 수 있지만 휠 재발견없이 현재 변환기를 재사용 할 수있는 솔루션을 선호합니다. 해당 솔루션이 존재하는 경우 ... – Natrium

0

두 대의 컨버터가 아닌 멀티 컨버터를 사용하는 것이 좋습니다. 기존 변환기의 논리를 재사용 할 수 있어야합니다. 시작하려면 this discussion을 확인하십시오.

3

프로젝트에서 우리가하는 일은 일반적인 BooleanToVisibilityConverter를 만드는 것으로, 변환기는 하나의 매개 변수 (모든 것은 문자열, int, bool 등)를 취합니다. 매개 변수가 설정되면 결과가 반전되고 그렇지 않으면 일반 결과가 출력됩니다.

public class CombiningConverter : IValueConverter 
    { 
     public IValueConverter Converter1 { get; set; } 
     public IValueConverter Converter2 { get; set; } 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      object convertedValue = Converter1.Convert(value, targetType, parameter, culture); 
      return Converter2.Convert(convertedValue, targetType, parameter, culture); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 

나는 다음과 같이 호출 :

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool? isVisible = value as bool?; 
     if (parameter != null && isVisible.HasValue) 
      isVisible = !isVisible; 
     if (isVisible.HasValue && isVisible.Value == true) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 

    #endregion 
} 
+1

xaml에서이 변환기를 호출하는 방법? – Natrium

49

이것은 내가 무슨 짓을

<converters:CombiningConverter x:Key="negatedBoolToVisibilityConverter" Converter1="{StaticResource NegatedBooleanConverter}" Converter2="{StaticResource BoolToVisibilityConverter}" /> 

MultiValueConverter도 내가 생각 할 수 있습니다. 어쩌면 나중에 다시 해보겠습니다.

+0

이것은 좋은 것입니다 ... – MoonKnight

23

Natrium의 위대한 답변을 확장하면 ...

XAML이 경우

<conv:ConverterChain x:Key="convBoolToInverseToVisibility"> 
    <conv:BoolToInverseConverter /> 
    <BooleanToVisibilityConverter /> 
</conv:ConverterChain> 

클래스

/// <summary>Represents a chain of <see cref="IValueConverter"/>s to be executed in succession.</summary> 
[ContentProperty("Converters")] 
[ContentWrapper(typeof(ValueConverterCollection))] 
public class ConverterChain : IValueConverter 
{ 
    private readonly ValueConverterCollection _converters= new ValueConverterCollection(); 

    /// <summary>Gets the converters to execute.</summary> 
    public ValueConverterCollection Converters 
    { 
     get { return _converters; } 
    } 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converters 
      .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converters 
      .Reverse() 
      .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); 
    } 

    #endregion 
} 

/// <summary>Represents a collection of <see cref="IValueConverter"/>s.</summary> 
public sealed class ValueConverterCollection : Collection<IValueConverter> { } 
+3

이 기사는 (http://www.codeproject.com/KB/WPF/PipingValueConverters_WPF.aspx)의 솔루션은 런타임 유형 검사를 제공합니다. –

+1

잘못된 targetType을 변환기로 전달합니다. 대상 targetType을 모든 변환기로 전달합니다.이 변환기는 시작 질문의 시나리오에서도 올바르지 않습니다. targetType이 실제로 "bool"일 때 "가시성"유형이 첫 번째 변환기로 전달됩니다. – CodePB

3

, 당신은 변환 체인이 필요하지 않습니다. 구성 가능한 변환기 만 있으면됩니다. 이것은 위의 Carlo의 대답과 유사하지만 true 및 false 값을 명시 적으로 정의합니다. 즉, 숨김, 보이기 또는 접힌 전환에 대해 동일한 변환기를 사용할 수 있습니다. 그런 다음 XAML에서

[ValueConversion(typeof(bool), typeof(Visibility))] 
public class BoolToVisibilityConverter : IValueConverter 
{ 
    public Visibility TrueValue { get; set; } 
    public Visibility FalseValue { get; set; } 

    public BoolToVisibilityConverter() 
    { 
     // set defaults 
     FalseValue = Visibility.Hidden; 
     TrueValue = Visibility.Visible; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

:

<BoolToVisibilityConverter x:Key="BoolToVisibleConverter" 
           FalseValue="Hidden" 
           TrueValue="Visible" /> 
+1

XAML 2009를 사용할 수있는 경우이를 일반화 할 수도 있습니다. 속성 구문 :'Converter = {c : BooleanConverter (Visibility) True = 가시, False = 접힘}'요소 구문 :'' XAML 2009를 사용할 수없는 경우에도 기본 클래스를 generic으로 만들 수 있지만 각 제네릭 형식에 대해 구체적인 파생 클래스가 필요합니다. –

관련 문제