我有一个具有DefaultText属性的自定义转换器。如果字符串为null或为空,我的所有转换器都会返回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有效。所以我不确定我做错了什么。
答案 0 :(得分:1)
我认为问题在于您使用Binding.ElementName。因为您的值转换器实际上不是可视树或逻辑树的一部分,所以绑定引擎无法知道它需要遍历哪个树以便找到具有匹配的ElementName的元素。
在这种情况下,您最好的选择是从代码后面专门设置绑定的Source属性,或者创建一个自定义标记扩展,为您抓取正确的对象。
答案 1 :(得分:0)
只是为答案#1 添加注释 - 即使转换器位于可视化或逻辑树中,您也不应该假设在DefaultText
执行之前设置Convert(...)
转换器中的{1}}。
答案 2 :(得分:0)
在我的情况下,我忘记了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>
这根本没有转换。断点没有达到。没事。
通过向我正在使用的属性中添加吸气剂和设置剂,页面可以识别值,并且绑定/转换器可以按要求工作。
public partial class MyPage: Page
{
public bool ShowLabel { get; set; }
}