2010-11-23 15 views
16

की वजह से बाध्यकारी मूल्यांकन नहीं किया जा सकता है एक डिफ़ॉल्ट मान का उपयोग करें वहाँ एक विशेष मूल्य जब एक बंधनसंपत्ति पथ में एक शून्य मान की वजह से मूल्यांकन नहीं किया जा सकता है आवंटित करने के लिए एक तरीका है?जब एक शून्य मान

उदाहरण के लिए अगर मैं एक वर्ग ग्राहक में नाम कोई संपत्ति है, और इस तरह एक बाध्यकारी:

{Binding CurrentCustomer.Name} 

जब CurrentCustomer रिक्त है मैं चाहता स्ट्रिंग "का निर्माण करने के लिए बाध्य --- "।

"TargetNullValue" और "FallbackValue" चाल नहीं लग रहा है।

आपकी मदद के लिए अग्रिम धन्यवाद।

संपादित:

तथ्य जब यह उपलब्ध नहीं है मुझे क्या करना सच के स्थान पर एक नए स्रोत मूल्य प्रतिस्थापन है कोशिश कर रहा हूँ में। वास्तविक परिदृश्य निम्न है:

एक बूल वैल्यू का उपयोग नियंत्रण की दृश्यता निर्धारित करने के लिए किया जाता है, लेकिन जब यह मान प्राप्य नहीं होता है तो मैं इसे "झूठी" से बदलना चाहता हूं।

MainPage.xaml.cs:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 

namespace TestSilverlightBindingDefaultValue 
{ 
    public class BoolToVisibilityConverter : IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return (bool)value ? Visibility.Visible : Visibility.Collapsed; 
     } 

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

     #endregion 
    } 

    public class Customer 
    { 
     public bool HasACar 
     { 
      get; 
      set; 
     } 
    } 

    public partial class MainPage : UserControl 
    { 
     public static readonly DependencyProperty CurrentCustomerProperty = 
      DependencyProperty.Register("CurrentCustomer", typeof(Customer), typeof(MainPage), null); 

     public Customer CurrentCustomer 
     { 
      get { return this.GetValue(CurrentCustomerProperty) as Customer; } 
      set { this.SetValue(CurrentCustomerProperty, value); } 
     } 

     public MainPage() 
     { 
      InitializeComponent(); 

      this.CurrentCustomer = null; 

      this.DataContext = this; 
     } 
    } 
} 

MainPage.xaml:

<UserControl x:Class="TestSilverlightBindingDefaultValue.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:local="clr-namespace:TestSilverlightBindingDefaultValue" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 
<UserControl.Resources> 
    <local:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" /> 
</UserControl.Resources> 
    <StackPanel x:Name="LayoutRoot" Background="White"> 
    <TextBlock Text="You have a car" Visibility="{Binding CurrentCustomer.HasACar,Converter={StaticResource boolToVisibilityConverter}}" /> 
</StackPanel> 

यहाँ एक उदाहरण है कि पूरी तरह से मेरा असली यूज-केस की नकल करता है FallbackValue समाधान becaus नहीं है ई यह केवल जेनरेट वैल्यू को बदल देगा, न कि स्रोत मूल्य।

अबे HeidebrechtPriorityBinding साथ WPFके लिए एकदम सही समाधान प्रदान की गई है, लेकिन यह सिल्वरलाइट में मौजूद नहीं है।

अंतिम संपादन: अबे Heidebrecht की दूसरी समाधान, यानी एक और तत्व में रैपिंग, पूरी तरह से काम कर रहा है।

<TextBlock> 
    <TextBlock.Text> 
     <PriorityBinding> 
      <Binding Path="CurrentCustomer.Name" /> 
      <Binding Source="---" /> 
     </PriorityBinding> 
    </TextBlock.Text> 
</TextBlock> 

ठीक है, सिल्वरलाइट के लिए यह एक आवरण (एक सीमा की तरह) में तत्व रैप करने के लिए एक शायद आसान है:

उत्तर

20

आप एक PriorityBinding इस्तेमाल कर सकते हैं।तो आप एक IValueConverterVisibility.Collapsed, और कुछ और करने के लिए अशक्त कन्वर्ट करने के लिए Visibility.Visible करने के लिए है:

public class NullToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value != null ? Visibility.Visible : Visibility.Collapsed; 
    } 

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

और इसलिए की तरह उपयोग:

<Border Visibility="{Binding CurrentCustomer, Converter={StaticResource NullToVisibilityConverter}}"> 
    <TextBlock Text="You have a car" Visibility="{Binding CurrentCustomer.HasACar,Converter={StaticResource boolToVisibilityConverter}}" /> 
</Border> 
+0

मुझे नहीं पता था कि आप यह कर सकते हैं .... यदि डेटा '{x: Null}' के बराबर है तो मैंने हमेशा डेटाट्रिगर जांच का उपयोग किया है। धन्यवाद! – Rachel

+0

धन्यवाद, यह प्रभावी रूप से समाधान होगा ... अगर मैं सिल्वरलाइट 4 का उपयोग नहीं कर रहा था जो प्राथमिकता बाइंडिंग का समर्थन नहीं करता है। – Pragmateek

+1

मैंने जवाब को अद्यतन किया है कि इसे चांदी की रोशनी में कैसे किया जाए। –

13

अरे TargetNullValue और FallbackValue काम करता है। आपके द्वारा उपयोग किए जा रहे .NET का संस्करण गलत हो सकता है।

यह .NET फ्रेमवर्क 3.5 एसपी 1 की आवश्यकता है .TargetNullValue और FallbackValue बाध्यकारी वर्ग

+0

धन्यवाद, आप सही हैं, लेकिन मेरा असली परिदृश्य अधिक जटिल है; मैं इसे स्पष्ट करने के लिए अपना प्रारंभिक प्रश्न अपडेट करूंगा। – Pragmateek

0

अगर आप नेट ढांचे का उपयोग करने के लिए एक नया इसके अतिरिक्त है 3.5 या उच्चतर आप targetnullValue उपयोग कर सकते हैं इस उदाहरण में आपके द्वारा बनाए गए है, तो पृष्ठभूमिप्रॉपर्टी नामक निर्भरता संपत्ति आप बाध्यकारी घोषणा में targetNullvalue का उपयोग कर सकते हैं। इस मामले में मैं संसाधन डिक्शनरी से रंग पास करता हूं।

<Style x:Key="LabelAxisNameStyle" TargetType="{x:Type Label}"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <Binding Path="BackgroundProperty" TargetNullValue="{StaticResource LabelTitleBrush}"/> 
       </Setter.Value> 
      </Setter> 
     </Style>    
संबंधित मुद्दे