2009-06-08 9 views
15

मैं WPF बताना चाहता हूँ: "TextBlock कोई डेटा नहीं है, तो यह नहीं दिखाते।"जब कोई डेटा नहीं होता है तो आप एक एक्सएएमएल टेक्स्टब्लॉक को कैसे पतन कर सकते हैं?

TRY # 1 एक सरल ट्रिगर साथ उत्पादन त्रुटि "'पाठ' सदस्य है मान्य नहीं है क्योंकि यह एक योग्यता प्रकार का नाम "नहीं है:।

<StackPanel Margin="10"> 
    <TextBlock Padding="10" Background="Yellow" Text="{Binding MainMessage}"> 
     <TextBlock.Triggers> 
      <Trigger Property="Text" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </Trigger> 
     </TextBlock.Triggers> 
    </TextBlock> 
</StackPanel> 

TRY # 2 एक शैली ट्रिगर के साथ टी का उत्पादन वह त्रुटि प्रकार 'शैली' एक सार्वजनिक प्रकार कनवर्टर वर्ग शामिल नहीं है:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <Trigger Property="Text" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

TRY # 3 एक शैली DataTrigger के साथ एक ही त्रुटि प्रकार 'शैली' का उत्पादन शामिल नहीं है एक सार्वजनिक प्रकार कनवर्टर वर्ग:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </DataTrigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

TRY # 4: ठीक है, कि मेरा एक गूंगा निरीक्षण किया गया था, भूल गया StaticResource, लेकिन फिर भी दोनों # 2 की कोशिश करो और # 3 का प्रयास करें एक नया त्रुटि शैली में टाइप System.Windows.Trigger मिल अज्ञात है:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <Trigger Property="Text" Value=""> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

तो कैसे मैं यह कर सकता हूं?

उत्तर:

ठीक है, इतना है कि एक खुश अंत के साथ करना कष्टदायक वाक्य रचना शिकार था, यहाँ संस्करण है कि काम करता है, आशा है कि यह किसी को मदद मिलती है सबक सीख लिया:

  • अगर ट्रिगर, तो शैली
  • अगर शैली है, तो StaticResource
  • अगर बाध्यकारी है, तो DataTrigger

कोड है कि काम करता है:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10"> 
     <ItemsControl 
      ItemsSource="{Binding DataTypeViews}"/> 
     <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 
+7

उह। डब्ल्यूपीएफ इतना भयानक क्यों है? – PeterAllenWebb

+2

डब्ल्यूपीएफ टीम के लिए कोई बहाना नहीं है कि क्यों # 4 काम नहीं करता है! डब्ल्यूपीएफ इतना गुप्त क्यों है? –

उत्तर

2

या तो प्रयास करें # 2 या # 3 का प्रयास करें ठीक होना चाहिए - या तो आप 'शैली का उपयोग करने की जरूरत है - समस्या लाइन जहां शैली संदर्भित कर रहे हैं में है = "{स्टेटिक रिसोर्स [कीनाम]}" 'या' स्टाइल = "{डायनामिक रिसोर्स [कीनाम]}" '।

इस (में प्रयास करें # 2) का प्रयास करें:

<StackPanel Margin="10">   
    <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
</StackPanel> 

में 1 की कोशिश करो आप वर्तमान WPF संस्करणों की एक सीमा का पता चलता है: ट्रिगर तत्वों पर सीधे समर्थित नहीं हैं।

+1

"ट्रिगर्स सीधे तत्वों पर समर्थित नहीं हैं।" - तब संकलक आपको यह बताना चाहिए, एक और असंबंधित त्रुटि नहीं। –

1

मुझे लगता है कि ऐसा करने का सबसे आसान तरीका एक कनवर्टर को परिभाषित करना होगा जो स्ट्रिंग को दृश्यता में परिवर्तित करता है।

... 

    return string.IsNullOrEmpty(s) ? Visibility.Collapsed : Visibility.Visible; 
} 

तो बस

<TextBlock Visibility="{StaticResource StringToVisibilityConverter}" 
5

सबसे आसान, सरल और तेज तरीका कन्वर्टर्स हैं। तो, क्यों नहीं किआईएसएस? (मूर्ख इसे सहज ही रखो)?

कनवर्टर कक्षाओं को लागू करने के लिए कोड की केवल कुछ पंक्तियां आवश्यक हैं।

कनवर्टर:

public class StringToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.IsNullOrWhiteSpace((string)value) ? Visibility.Collapsed : Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var visiblity = (Visibility)value; 
     return visiblity == Visibility.Visible; 
    } 
} 

उपयोग:

नाम स्थान को शामिल करें: xmlns:c="clr-namespace:Hfr.Windows.Controls"

परिभाषित संसाधन: <c:StringToVisibilityConverter x:Key="StringToVisiblity"/>

में यह प्रयोग करें:

<TextBlock 
    Text="{Binding SomeStringPropertyValue}" 
    TextWrapping="Wrap" 
    Visibility="{Binding SomeStringPropertyValue, Converter={StaticResource StringToVisiblity}}" /> 

चूंकि आप अपने कन्वर्टर्स कई परियोजनाओं में, कनवर्टर कक्षाएं एक "आम पुस्तकालय" में इस्तेमाल करेंगे लागू।

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

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