2011-02-10 2 views
2

다음과 같은 코드가 있다고 가정 해 보겠습니다.값 변환기. WPF가 한 번만 호출하도록합니다.

<ContextMenu IsEnabled="{Binding Converter={StaticResource SomeConverterWithSmartLogic}}"> 

따라서 변환기를 제외한 바인딩 정보를 지정하지 않았습니다. WPF가 한 번만 호출하도록 할 수 있습니까?

UPD :이 순간 나는 정적 필드

값 변환기의 상태를 저장 해요.
+0

이 문제를 해결하는 대신 전역 변수^H^H^H^H^H^H^H^H^H^H^H^H^H의 문제를 해결 선택하는 이유가^H^Hstatic 필드 사용? –

+0

IMHO 이것은 ViewModel에서 수행되어야하며 변환기를 모두 제거해야합니다. 이 인스턴스에서는 변환기가 현명하지 않아야합니다. –

답변

1

, 적어도 예를 들어, 정적 필드 등을 필요로하지 않습니다

[ValueConversion(typeof(double), typeof(double))] 
public class DivisionConverter : IValueConverter 
{ 
    double? output; // Where the converted output will be stored if the converter is run. 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (output.HasValue) return output.Value; // If the converter has been called 
                // 'output' will have a value which 
                // then will be returned. 
     else 
     { 
      double input = (double)value; 
      double divisor = (double)parameter; 
      if (divisor > 0) 
      { 
       output = input/divisor; // Here the output field is set for the first 
              // and last time 
       return output.Value; 
      } 
      else return DependencyProperty.UnsetValue; 
     } 
    } 

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

NotImplementedException을 throw하지 않습니다. 그것은 구현되지 않은 것을위한 것입니다. ConvertBack의 의도 된 구현이 던져 질 경우 효과적으로 구현됩니다. 올바른 예외는 NotSupportedException입니다. –

+0

저는이 경우 변환이 모두 가능하기 때문에 구현되지 않았기 때문에 이에 대해 논쟁 할 수 있다고 생각합니다. 이 예제에서는 바로 여기에 'NotSupportedException'을 사용하는 것이 좋습니다. –

1

에 값 컨버터의 상태를 저장하고있어 당신은 한때 바인딩 설정 봤어? 즉 다른 장애를 일으키지 않는 경우에만 당신이 당신의 계산기를 쓸 수 한 번 컨버터해야 컨버터를 그런 식으로 할 경우

+0

예, 도움이되지 않았습니다. –

+0

컨텍스트 메뉴가 DataTemplate (잊어 버렸습니다)의 일부이기 때문에 컨텍스트 메뉴를 지정한 모든 항목에 대해 VC가 호출됩니다. 그리고 나서 선택 사항이 변경 될 때마다 ... –

+0

이 경우 변환기에 자신의 "캐시"를 만들어야합니다. –