我正在开发 WPF 表单设计器,您可以在其中将标签、文本框、组合框等控件拖放到设计图面上,然后通过属性网格用户可以为每个控件设置数据绑定。我需要为那些没有为给定属性设置绑定的控件显示红色背景。
我最初的想法是创建一个 HasBindingConverter,它将获取调用元素本身并检查它是否具有与某个属性的绑定。在这种情况下TextBox.TextProperty
public class HasBindingConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
FrameworkElement fe = value as FrameworkElement;
if(fe != null)
{
Binding binding = BindingOperations.GetBinding(fe, TextBox.TextProperty);
return binding != null;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
然后我将一个与 TextBox 控件类型关联的样式添加到我的表单的资源部分,它是一个用户控件:
<UserControl.Resources>
<Style TargetType="TextBox">
<Style.Resources>
<Converters:HasBindingConverter x:Key="HasBindingConv"/>
</Style.Resources>
<Style.Triggers>
<DataTrigger
Binding="{Binding,
RelativeSource={RelativeSource Self},
Converter={StaticResource HasBindingConv}}"
Value="False">
<Setter Property="TextBox.Background" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding
RelativeSource={RelativeSource Self},
Converter={StaticResource HasBindingConv}}"
Value="True">
<Setter Property="TextBox.Background" Value="White" />
</Style.Triggers>
</Style>
因此,如果 TextBox 没有为 TextBox.TextProperty 设置数据绑定,那么它将其背景设置为红色。这部分工作正常,问题是当用户为此控件设置 TextBox.TextProperty 绑定时,我的 Converter 不再被调用,因此背景保持红色。
任何人都知道在设置此控件的绑定后如何调用触发器?或任何其他建议,我可能以错误的方式处理问题。
谢谢!