2010-09-23 68 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(...)在转换器在执行前设置。