2010-09-23 66 views
1

我有一個具有DefaultText屬性的自定義轉換器。如果字符串爲空或空,我所有的轉換器都會返回DefaultText。我似乎無法讓它工作。這是我得到的。這是轉換器類。對於轉換器不工作的WPF綁定

public class DisplayValueConverter : DependencyObject, IValueConverter 
{ 
    public static readonly DependencyProperty DefaultTextProperty = DependencyProperty.Register("DefaultText", 
                           typeof (string), 
                           typeof (DisplayValueConverter)); 

    public string DefaultText 
    { 
     get { return (string) GetValue(DefaultTextProperty); } 
     set { SetValue(DefaultTextProperty, value); } 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     string empty = (parameter != null) ? parameter as string : DefaultText; 
     return (value != null && !string.IsNullOrEmpty(value.ToString().Trim())) ? value.ToString() : empty; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

這是我的xaml將其投入使用。

 <TextBox Grid.Column="1" 
       Grid.Row="3" 
       VerticalAlignment="Center" 
       Margin="0,0,10,0" > 
      <TextBox.Text> 
       <Binding Path="DataSource.Payee" 
         Mode="TwoWay" 
         NotifyOnSourceUpdated="True" 
         NotifyOnTargetUpdated="True" 
         NotifyOnValidationError="True" 
         ValidatesOnDataErrors="True" 
         UpdateSourceTrigger="PropertyChanged"> 
        <Binding.Converter> 
         <k:DisplayValueConverter DefaultText="{Binding ElementName=This, Path=Test, Mode=TwoWay}" /> 
        </Binding.Converter> 
        <Binding.ValidationRules> 
         <vr:RequiredField Label="Payee" /> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 

我驗證了DataContext有一個對象,並且該路徑起作用。所以我不確定我做錯了什麼。

+0

究竟發生了什麼? – rossisdead 2010-09-23 17:01:57

+0

@rossisdead - 沒什麼。我期待數據綁定引擎首先綁定轉換器屬性DefaultText,然後嘗試綁定路徑DataSource.Payee上的文本屬性,但沒有任何反應。 – Matt 2010-09-23 17:13:29

+1

您是否有DefaultText綁定中指定的名爲「This」的元素? – 2010-09-23 17:24:00

回答

1

我認爲問題在於您使用Binding.ElementName。因爲您的值轉換器實際上並不是視覺或邏輯樹的一部分,所以綁定引擎無法知道它需要遍歷哪個樹,才能找到具有匹配ElementName的元素。

在這種情況下,最好的辦法是從代碼背後專門設置綁定的Source屬性,或者創建一個自定義標記擴展名,以便爲您抓取正確的對象。

+1

這是有道理的。我將代碼中的綁定設置爲它的魅力。 – Matt 2010-09-23 19:30:02

0

只是添加註釋到答案#1 - 即使轉換器將在視覺或邏輯樹,你不應該假設DefaultText會的Convert(...)在轉換器在執行前設置。