2011-04-09 12 views
7

मैं एक TextBlock कि एक ViewModel में एक संपत्ति के लिए बाध्य है के लिए एक "NullText" व्यवहार को लागू करना चाहते हैं। जब ViewModel में है कि संपत्ति शून्य या खाली है, मैं की तरह "कोई डेटा" ग्रे इटैलिक पाठ कुछ प्रदर्शित करना चाहते हैं। मुझे यह पसंद होता MVVM पैटर्न का पालन करने के लिए, लेकिन मैं हार रहा हूँ ...बाध्यकारी के साथ टेक्स्टब्लॉक में NullText को कैसे कार्यान्वित करें?

अद्यतन तो समाधान जेम्स वेबस्टर सुझाव के साथ चारों ओर खेलने के बाद, मैं इसे इस तरह काम करने के लिए ... मिल गया

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
    <c:NullOrEmptyValueConverter x:Key="NullOrEmptyValueConverter" Text="(No Data)"/> 
</UserControl.Resources> 

...  

<TextBlock Name="SerialNumberTextBlock" Text="{Binding Path=SerialNumber, Converter={StaticResource NullOrEmptyValueConverter}}"> 
    <TextBlock.Resources> 
     <Style TargetType="TextBlock"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="(No Data)"> 
        <Setter Property="FontStyle" Value="Italic"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Resources> 
</TextBlock> 
+0

अपने मौजूदा दृश्य और दृश्य मॉडल कोड क्या है के रूप में सिस्टम नाम स्थान शामिल करने की ज़रूरत? – BoltClock

+0

दरअसल, व्यूमोडेल एक ऑब्जेक्ट का अवलोकन करने योग्य चयन है जो स्वयं ही देखे जा सकता है। यह संग्रह तब आइटम्स कंट्रोल से जुड़ा हुआ है। फिर आइटम्स कंट्रोल में। टेम्पलेट, मेरे पास संग्रह में आइटम की एक संपत्ति के लिए एक टेक्स्टब्लॉक है। यदि वह संपत्ति खाली या शून्य है, तो मुझे व्यू में आइटम नियंत्रण में "कोई डेटा" दिखाना नहीं है। – Jim

उत्तर

4

मैं IValueConverter को लागू करने की अनुशंसा करता हूं; यदि स्रोत मान शून्य या खाली नहीं है, तो इसे टेक्स्टब्लॉक पर पास करें। यदि स्रोत मान शून्य या खाली है, तो अपने चुने हुए पाठ को प्रस्तुत करें।

public class NullValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string str = (string)value; 
     if (str.IsNullOrWhitespace()) 
     { 
      return "No Data"; 
     } 
     return str; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     ... //An empty implementation I expect... 
    } 
} 

हालांकि मैं सिर्फ एहसास हो गया आप के रूप में अच्छी तरह से एक DataTrigger कि शैली सेट शैली स्थापित करने के लिए ... हममम, शायद अगर मान 'कोई डेटा नहीं' की आवश्यकता मैं उम्मीद चाहते हैं कि;

<TextBlock Text="{Binding Path=SomeProperty, Converter={StaticResource keyToNullValueConverter}"> 
    <TextBlock.Triggers> 
     <DataTrigger Binding="{Binding Path=Text}" Value="No Data"> 
      <Setter Property="FontStyle" Value="Italic"/> 
     </DataTrigger> 
    </TextBlock.Triggers> 
</TextBlock> 

उन पंक्तियों के साथ कुछ काम कर सकता है।

+0

+1, लेकिन आपको इसे ठीक करना चाहिए: 'string str = (dateTime) मान;';) –

+0

मुझे यह विचार पसंद है। मुझे इसकी कोशिश करनी होगी! – Jim

+0

@ थॉमस; धन्यवाद, तय है। –

0

आप एक संपत्ति है कि इस प्रकार दिखता

private string _textBlockText; 
    public string TextBlockText 
    { 
     get 
     { 
      if(string.IsNullOrEmpty(_textBlockText)) 
      { 
       return "No Data"; 
      } 
      return _textBlockText; 
     } 
     set 
     { 
      _textBlockText = value; 
     } 
    } 

और उसके बाद XAML कि जेम्स स्टाइल के लिए उल्लेख किया है उपयोग करने के लिए बाध्य करने के लिए कोशिश कर सकते। कनवर्टर की आवश्यकता बचाता है।

+0

देख मुझे लगता है कि यह एक उदाहरण में काम करेगा, लेकिन जब देखते हैं कई TextBlocks और मूल्यों में एक ही NullText को लागू करने के लिए मिला है, मैं लगता है कि कनवर्टर दृष्टिकोण बेहतर है। वैसे भी धन्यवाद! – Jim

2

मुझे लगता है कि आप कनवर्टर क्लास बनाने की जरूरत नहीं है, तो आप बस इस तरह से अपनी शैली कोड लिख सकते हैं।

<Style TargetType="TextBlock">    
<Style.Triggers>     
<DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="{x:Null}">      
<Setter Property="FontStyle" Value="Italic"/> 
</DataTrigger> 
<DataTrigger Binding="{Binding ElementName=SerialNumberTextBlock, Path=Text}" Value="{x:Static System:String.Empty}">      
<Setter Property="FontStyle" Value="Italic"/> 
</DataTrigger> 
</Style.Triggers>   
</Style> 

नोट: - आप

xmlns:System="clr-namespace:System;assembly=mscorlib" 
+0

वैकल्पिक टेक्स्ट सेट करने के लिए आप क्या करेंगे, उदा। "कोई आकड़ा उपलब्ध नहीं है" ? – Jim

+0

आवश्यक टेक्स्ट सेट करने के लिए प्रत्येक डेटाैट्रिगर पर एक और सेटर जोड़ें। – pchajer

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