【问题标题】:WPF binding for a converter not working转换器的 WPF 绑定不起作用
【发布时间】:2011-04-16 09:21:07
【问题描述】:

我有一个具有 DefaultText 属性的自定义转换器。如果字符串为空或为空,我的转换器所做的只是返回 DefaultText。我似乎无法让它工作。这就是我所拥有的。这是转换器类。

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 有一个对象,并且 Path 有效。所以我不确定我做错了什么。

【问题讨论】:

  • @rossisdead - 什么都没有。我期待数据绑定引擎首先绑定转换器属性 DefaultText,然后尝试绑定路径 DataSource.Payee 上的文本属性,但没有任何反应。
  • 您的 DefaultText 绑定中是否指定了一个名为“This”的元素?
  • 我认为您的问题是您期望 DefaultText 属性会导致调用转换器的 Convert 方法。这不会发生,因为它与 TextBox 自己的绑定无关。最好设置 TextBox 的绑定的 TargetNullValue 或 DefaultValue 或这些属性之一。
  • 首先检查断点是否命中。其次,检查输出窗口中是否有任何绑定错误。正如理智的 Wonko 所说,确保“This”在您的上下文中。
  • 没有命中断点,但是有一个名为“This”的元素。就好像绑定引擎在尝试对属性 DefaultText 进行数据绑定之前调用了 convert 方法。

标签: wpf binding


【解决方案1】:

我认为问题在于您对 Binding.ElementName 的使用。因为您的值转换器实际上并不是可视树或逻辑树的一部分,所以绑定引擎无法知道它需要遍历什么树才能找到具有匹配 ElementName 的元素。

在这种情况下,最好的办法是从后面的代码中专门设置绑定的 Source 属性,或者创建一个自定义标记扩展来为您获取正确的对象。

【讨论】:

  • 这是有道理的。我在代码中设置了绑定,它就像一个魅力。
【解决方案2】:

只是为了向 answer#1 添加注释 - 即使转换器位于可视树或逻辑树中,您也不应该假设 DefaultText 将在执行 Convert(...) 之前设置在转换器中。

【讨论】:

    【解决方案3】:

    在我的例子中,我忘记了 WPF 要求绑定到代码隐藏值必须使用 getter 和 setter 显式声明为公共属性。

    所以这失败了:

    public partial class MyPage: Page
    {
        public bool ShowLabel;  //No get/set !
    
        // constructor etc...
    }
    
    <Page x:Name="pageName">
    
        <Label Content="Hello" 
               Visibility="{Binding 
                               Path=ShowLabel, 
                               ElementName=pageName, 
                               Converter={StaticResource VisibilityConverter}}"/>
    
    </Page>
    

    这根本没有转换。断点没有命中。什么都没有。

    通过向我正在使用的属性添加 getter 和 setter,页面可以识别这些值并且绑定/转换器按要求工作。

    public partial class MyPage: Page
    {
        public bool ShowLabel { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 1970-01-01
      • 2017-11-09
      • 2011-10-02
      • 1970-01-01
      • 2010-12-30
      • 2011-04-21
      相关资源
      最近更新 更多