2010-04-19 4 views
8

작동하지 않는 것 같습니다 때문에 부탁드립니다. FallbackValue는 MultiBinding과 어떻게 작동합니까?

우리는 다음과 같은 개체에 바인딩하고 가정 :

public class HurrDurr 
{ 
    public string Hurr {get{return null;}} 
    public string Durr {get{return null;}} 
} 

글쎄, 우리가 사용하는 경우이에 대한 MultiBinding 대체 값이 오른쪽 표시 될 것으로 생각된다?

<TextBlock> 
    <TextBlock.Text>         
     <MultiBinding StringFormat="{}{0} to the {1}" 
         FallbackValue="Not set! It works as expected!)"> 
      <Binding Path="Hurr"/> 
      <Binding Path="Durr"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

결과가 그러나, 사실,의 "를". 심지어 DependencyProperty.UnsetValue이 작동하지 않는 반환하는 바인딩을 강제 :

<TextBlock xmnlns:base="clr-namespace:System.Windows;assembly=WindowsBase"> <TextBlock.Text> <MultiBinding StringFormat="{}{0} to the {1}" FallbackValue="Not set! It works as expected!)"> <Binding Path="Hurr" FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> <Binding Path="Durr" FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> </MultiBinding> </TextBlock.Text> </TextBlock> 

또한 주위의 모든 방법 흉상이었다 TargetNullValue와 같은 시도.

따라서 멀티 바인딩은 절대로 FallbackValue을 사용하지 않습니다. 이게 사실인가요, 아니면 제가 빠진 것이 있습니까?


은 조금 더 장난 그리고 내가 필요 컨버터는 UnsetValue를 반환 할 수 있다는 것을 발견 :

class MultiValueFailConverter : IMultiValueConverter 
{ 
    public object Convert(
     object[] values, 
     Type targetType, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (values == null || 
      values.Length != 2 || 
      values.Any(x=>x == null)) 
      return System.Windows.DependencyProperty.UnsetValue; 
     return values; 
    } 

    public object[] ConvertBack(
     object value, 
     Type[] targetTypes, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("Too complex hurt brain."); 
    } 
} 

그러나,이 더러운 더러운 해킹처럼 보인다. 나는 이런 시나리오가 프레임 워크에서 설명 될 것이라고 생각한다. 하지만 리플렉터에서는 아무것도 찾을 수 없습니다.

+0

좋은 질문 !! – Chris

답변

7

이 질문은 다소 오래된 질문이지만 약간의 설명을 사용할 수 있습니다. FallbackValue documentation에서

:

결속 반환 값 성공적 경우 :

  1. 바인딩 소스에 대한 경로가 성공적으로 해결합니다.
  2. 값 변환기 (있는 경우)는 결과 값을 변환 할 수 있습니다.
  3. 결과 값은 바인딩 대상 (대상) 속성에 유효합니다. 가능한 경우 1 및 2 복귀 DependencyProperty.UnsetValue, target 속성이 상기 FallbackValue의 값으로 설정하면

. 에 FallbackValue가없는 경우 대상 속성의 기본값은 입니다.

제공된 예에서, 바인딩은 HurrDurr 속성으로 성공적으로 해결됩니다. Null은 바인딩이 유효한 문자열을 나타내는 유효한 값입니다.

즉, 바인딩이 값을 반환 할 수 없을 때 FallbackValue가 사용되며 제공된 예제에서 바인딩이 유효한 값을 제공합니다.예

취하는 본래 예를 기반으로하는 다음의 각각의 단편 다음과 Hurr 뒤르 특성이 올바르게 결합되어 1

예; null은 유효한 값이며 FallbackValue는 절대로 볼 수 없습니다. Hurr 및 뒤르 특성이 제대로 결합되지 않은 2

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is valid. I will never be seen." StringFormat="{}{0} to the {1}"> 
      <Binding Path="Hurr" /> 
      <Binding Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

예; FallbackValue가 표시됩니다. 하나 개의 결합 경로가 유효하지 않은 경우

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding paths are invalid. Look at me." StringFormat="{}{0} to the {1}"> 
      <Binding Path="xHurr" /> 
      <Binding Path="xDurr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

예 3
다음 FallbackValue는 알 수있을 것이다. FallbackValue 사용되지 않도록

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="One binding path is invalid. Look at me." StringFormat="{}{0} to the {1}"> 
      <Binding Path="xHurr" /> 
      <Binding Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

예 4
앞의 예와 같이, 결합은 정확하다. 또한 각 자식 Binding 부모의 MultiBinding 속성에 대한 FallbackValue는 자식 바인딩이 아닌 MultiBinding의 대상 속성에 사용될 FallbackValue를 참조해야합니다.

<TextBlock xmlns:base="clr-namespace:System.Windows;assembly=WindowsBase"> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is valid. I will never be seen." StringFormat="{}{0} to the {1}"> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" Path="Hurr" /> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

예 5
바인딩이 경로가 있기 때문에 Binding 속성에서 제공되지 않은 경우에도 여전히 유효한이 결합되어 어떤 개체를 사용합니다 바인딩.

<TextBlock xmlns:base="clr-namespace:System.Windows;assembly=WindowsBase"> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is still valid. I will never be seen." StringFormat="{}{0} to the {1}"> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

컨버터는 UnsetValue 강제 바인딩 속성 중 하나에 추가하는 경우 (6)
마지막 다음 MultiBinding FallbackValue가 알 수있는 예제

변환기

internal class ForceUnsetValueConverter : IValueConverter 
{ 
    #region Implementation of IValueConverter 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DependencyProperty.UnsetValue; 
    } 

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

    #endregion 
} 

xaml

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is valid, but look at me. I'm an UnsetValue." StringFormat="{}{0} to the {1}"> 
      <Binding Converter="{StaticResource ForceUnset}" Path="Hurr" /> 
      <Binding Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock>