2010-04-19 7 views
8

मैं पूछता हूं क्योंकि यह काम नहीं कर रहा है।FallbackValue मल्टीबाइंडिंग के साथ कैसे काम करता है?

मान लें हम निम्नलिखित वस्तु के लिए बाध्य कर रहे हैं:

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 है, जो भी एक प्रतिमा के आसपास सभी तरह था के साथ एक ही कोशिश की।

तो ऐसा लगता है कि MultiBinding कभी 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, लक्ष्य संपत्ति , FallbackValue के मान पर सेट है, तो अगर एक उपलब्ध है। यदि कोई फॉलबैक वैल्यू नहीं है, तो लक्षित संपत्ति का डिफ़ॉल्ट मान उपयोग किया जाता है।

प्रदान की उदाहरण में, सफलतापूर्वक बाध्यकारी Hurr और Durr गुणों के हल करता है। नल एक स्ट्रिंग के लिए वैध मान है जिसका मतलब है कि बाध्यकारी मान्य है।

दूसरे शब्दों में, फ़ॉलबैक वैल्यू का उपयोग तब किया जाता है जब बाध्यकारी मान वापस करने में असमर्थ है और प्रदान किए गए उदाहरण में, बाध्यकारी वैध मान प्रदान करता है।उदाहरण के लिए

लें निम्नलिखित स्निपेट जो बंद मूल उदाहरण आधारित हैं में से प्रत्येक:

उदाहरण 1
Hurr और ड्यूर गुण सही ढंग से बंधे हुए हैं; शून्य एक वैध मान है और FallbackValue कभी नहीं देखा जाएगा।

<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> 

उदाहरण 2
Hurr और ड्यूर गुण सही ढंग से बाध्य नहीं कर रहे हैं; 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 देखा जाएगा।

<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
पिछले उदाहरण के रूप में, बंधन तो FallbackValue उपयोग नहीं किया जाएगा, सही है। इसके अलावा, माता-पिता के प्रत्येक बच्चे Binding गुणों के लिए फ़ॉलबैक वैल्यू को मल्टीबाइंडिंग की लक्षित संपत्ति के लिए उपयोग किए जाने वाले फ़ॉलबैक वैल्यू का उल्लेख करना चाहिए, न कि बच्चे बाइंडिंग के लिए।

<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> 

उदाहरण 6
अंत में, यदि एक कनवर्टर एक UnsetValue मजबूर करने के लिए बाध्यकारी विशेषताओं में से किसी को जोड़ा गया है, तो 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 
} 

एक्सएएमएल

<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>