2011-06-28 15 views
30

मेरे पास दृश्यता के लिए दो अलग-अलग कन्वर्टर्स हैं, एक इस पर आधारित है कि कोई फ़ील्ड अपडेट किया गया है और कोई इस पर आधारित है कि फ़ील्ड को देखने की अनुमति है या नहीं। मैं अपने पेज पर प्रत्येक टेक्स्ट आइटम के लिए अपडेटेड फ़ील्ड का उपयोग करता हूं ताकि एक स्टार एक अपडेटेड फ़ील्ड के बगल में दिखाई दे। लेकिन कुछ टेक्स्ट आइटम केवल अनुमति स्तरों के आधार पर कुछ उपयोगकर्ताओं के लिए दृश्यमान होते हैं।बूलियन और दो दृश्यता कन्वर्टर्स कैसे करें

उदाहरण के लिए:

<Image Visibility="{Binding ElementName=MyObject, Path=UpdatedFields, Mode=OneWay, Converter={StaticResource updatedFieldConverter}, ConverterParameter=FieldToTest}" Source="Properties:Resources.star_yellow" /> 

और

<TextBlock FontSize="21" Foreground="{DynamicResource LabelBrush}" Text="{x:Static Properties:Resources.Some_Text}" Visibility="{Binding Source={StaticResource allowedFields}, Path=Some_Text_Field, Converter={StaticResource visibilityConverter}}" /> 

मेरे समस्या अनुमति आवश्यक फ़ील्ड के मामले के लिए मैं दोनों कन्वर्टर्स चलाने के लिए निर्धारित करने के लिए करता है, तो स्टार दिखाता है कि जरूरत है। क्या दो कन्वर्टर्स के परिणामों पर बुलियन "और" करने का कोई तरीका है?

मैंने this post पर देखा लेकिन यह दो अलग-अलग कन्वर्टर्स में पैरामीटर के विभिन्न सेटों को पारित करने की अनुमति नहीं देता है।

------- अद्यतन --------

मैं भी इस XAML

<Image Grid.Row="4" Grid.Column="0" Source="star_yellow.png"> 
    <Image.Visibility> 
     <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest" > 
     <Binding ElementName="allowedFieldsModel" Path="Some_Text_Field" Mode="OneWay" />       
     <Binding ElementName="MyObject" Path="UpdatedFields" Mode="OneWay" /> 
     </MultiBinding> 
    </Image.Visibility> 
</Image> 

के साथ एक MultiValueConverter बनाने की कोशिश की लेकिन जब यह कनवर्टर दोनों मूल्यों में प्रवेश करती है "DependencyProperty.UnsetValue"। तो मैं स्पष्ट रूप से यहाँ कुछ गलत कर रहा हूँ।

-------- समाधान ---------

मैं इस को संशोधित करने के लिए किया था, लेकिन उसके बाद यह काम किया।

<Image.Visibility> 
    <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest"> 
     <Binding Source="{StaticResource allowedFieldsModel}" Path="Some_Text_Field" /> 
     <Binding Path="MyObject.UpdatedFields" /> 
    </MultiBinding> 
</Image.Visibility> 

उत्तर

53

आप एक छोटे, हाथ से बने IMultiValueConverter के साथ एक मल्टीबाइंडिंग का उपयोग कर सकते हैं।

उदाहरण:

<StackPanel> 
    <StackPanel.Resources> 
     <local:MultiBooleanToVisibilityConverter x:Key="Converter" /> 
    </StackPanel.Resources> 
    <CheckBox x:Name="Box1" /> 
    <CheckBox x:Name="Box2" /> 
    <TextBlock Text="Hidden Text"> 
     <TextBlock.Visibility> 
      <MultiBinding Converter="{StaticResource Converter}"> 
       <Binding ElementName="Box1" 
          Path="IsChecked" /> 
       <Binding ElementName="Box2" 
          Path="IsChecked" /> 
      </MultiBinding> 
     </TextBlock.Visibility> 
    </TextBlock>     
</StackPanel> 

... और कनवर्टर ...

class MultiBooleanToVisibilityConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     bool visible = true; 
     foreach (object value in values) 
      if (value is bool) 
       visible = visible && (bool)value; 

     if (visible) 
      return System.Windows.Visibility.Visible; 
     else 
      return System.Windows.Visibility.Hidden; 
    } 

    public object[] ConvertBack(object value, 
           Type[] targetTypes, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

मैंने कोशिश की कि बिना किसी किस्मत के, – Bill

+1

@Piciclopz अपडेट करें: मैंने एक उदाहरण दिया है।यह मेरी मशीन पर काम करता है =) आपका मामला उस से अधिक जटिल प्रतीत होता है, लेकिन शायद यह मदद करता है। – Jens

+0

यह लगभग मेरे लिए काम करता था, लेकिन जैसा कि आपने कहा था, मेरा मामला थोड़ा और जटिल था। मैंने ऊपर अपना समाधान पोस्ट किया। आपकी सहायता के लिए धन्यवाद. – Bill

3

एक बात यह है कि मन में आए दो अलग बूलियन क्षेत्रों, एक एकल बिट क्षेत्र एक साथ updatedField और allowedField Oring द्वारा बनाई गई के बजाय शायद, है। फिर आपके पास तीन मान कनवर्टर्स हो सकते हैं, सभी एक ही क्षेत्र पर चल रहे हैं।

या बस अपने डेटा मॉडल में एक और फ़ील्ड की गणना करें जो वहां एंडिंग करता है। यह शायद अधिक कुशल है (रनटाइम के मामले में)।

+0

क्या आप इस पर अधिक जानकारी प्रदान कर सकते हैं? मुझे समझ में नहीं आता कि आप xaml में ऐसा कैसे करेंगे। – Bill

+1

आप इसे xaml में बिल्कुल नहीं करते हैं। –

0

आप ConverterParameter में कनवर्टर करने के लिए दो वस्तुओं की एक सरणी गुजारें सकता - में सरणी का निर्माण XAML।

+0

xaml में कनवर्टरपरमीटर में दो ऑब्जेक्ट्स कैसे पास करें? मुझे यह जानना अच्छा लगता है कि ... – Sam

15

यहां पार्टी के लिए देर हो चुकी है लेकिन एक आसान समाधान है कि नियंत्रण को किसी अन्य नियंत्रण में लपेटें। मैं इसे बहुत सारे कनवर्टर्स रखने के लिए पसंद करता हूं जो अलग-अलग चीजें करते हैं।

<StackPanel Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}"> 
<ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/> 
</StackPanel> 
+1

शानदार! ऐसी साधारण चीज़ के लिए अतिरिक्त कक्षा लिखने की जरूरत नहीं है! – TheBoyan

+2

डब्ल्यूपीएफ चैट से - सर्वसम्मति यह है कि सीमाएं इस तरह कुछ करने का सबसे सस्ता तरीका है (स्टैकपैनल की बजाय)। –

+0

मैंने इसे सभी की मदद करने के लिए संपादित करने की कोशिश की लेकिन इसे अस्वीकार कर दिया गया क्योंकि इस साइट पर लोग बेवकूफ हैं – Asheh

संबंधित मुद्दे