WPF自定义控件中如何在后台代码为StateBrush依赖属性自动配置带转换器的PLC变量绑定
实现方案:自动为StateBrush配置带参数的VariableBinding
当然可以实现你的需求!我们只需要在自定义控件的后台代码中,利用依赖属性的变更回调,在InstanceAdresFFU值发生变化时,自动构建并应用带有转换器、状态集合等参数的VariableBinding到StateBrush属性上。
具体实现步骤
1. 修正依赖属性命名并添加变更回调
首先,你的代码里InstanceAdresFFUyProperty是笔误,需要修正为InstanceAdresFFUProperty,同时为这个依赖属性添加PropertyChangedCallback,用来监听地址变化并自动创建绑定:
namespace HMI.CustomControl { public class CustomControl1 : System.Windows.Controls.Button { public Brush StateBrush { get { return (Brush)GetValue(StateBrushProperty); } set { SetValue(StateBrushProperty, value); } } public static readonly DependencyProperty StateBrushProperty = DependencyProperty.Register(nameof(StateBrush), typeof(Brush), typeof(CustomControl1), new PropertyMetadata(default(Brush))); public string InstanceAdresFFU { get { return (string)GetValue(InstanceAdresFFUProperty); } set { SetValue(InstanceAdresFFUProperty, value); } } public static readonly DependencyProperty InstanceAdresFFUProperty = DependencyProperty.Register(nameof(InstanceAdresFFU), typeof(string), typeof(CustomControl1), new PropertyMetadata(string.Empty, OnInstanceAdresFFUChanged)); // 地址变更回调方法,自动构建绑定 private static void OnInstanceAdresFFUChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as CustomControl1; if (control == null || string.IsNullOrEmpty(e.NewValue?.ToString())) return; // 拼接完整的变量地址 var fullVariableName = $"{e.NewValue}.Observers.oStatus"; // 实例化VisiWin的VariableBinding扩展(对应XAML中的vw:VariableBinding) var variableBinding = new VisiWin.VariableBinding() // 替换为你项目中vw命名空间对应的实际类型 { VariableName = fullVariableName, // 从全局资源获取转换器和状态集合 Converter = Application.Current.Resources["ValueToStateBrushConverter"] as IValueConverter, States = Application.Current.Resources["BrushListState"] as IEnumerable, // 根据实际类型调整 StateMode = VisiWin.StateMode.Value // 替换为对应枚举的实际值 }; // 将绑定应用到StateBrush属性 control.SetBinding(StateBrushProperty, variableBinding); } } }
2. 关键细节说明
- 自定义绑定扩展实例化:因为你用的是
vw:VariableBinding(VisiWin7的自定义绑定扩展),所以不能用普通的Binding类,必须直接实例化这个扩展类型,确保引用正确的命名空间。 - 静态资源获取:通过
Application.Current.Resources获取XAML中定义的全局静态资源,如果资源是在控件的Generic.xaml或局部ResourceDictionary中,可以改用control.TryFindResource("资源名")来获取,兼容性更好。 - 空值防护:回调中先判断控件实例和新地址是否有效,避免空引用异常;如果需要支持地址清空时移除绑定,可以在
else分支调用control.ClearValue(StateBrushProperty)。
3. 验证简化后的XAML使用
现在你可以完全按照预期简化MainView中的控件声明,只保留InstanceAdresFFU配置即可:
<cc:CustomControl1 x:Name="FFU_2" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="4" Margin="96,243,0,0" Width="44" Height="30" BorderThickness="1" InstanceAdresFFU="MCS1.Cleanroom.SIM_Cleanroom.SIM_FFUControl2"/>
额外注意事项
- 如果
VariableBinding的States属性有特定类型(比如自定义的BrushStateCollection),请替换代码中对应的类型声明。 - 如果你的项目中
VisiWin的命名空间别名不是VisiWin,请调整为实际的命名空间路径。
内容的提问来源于stack exchange,提问作者YoungRexroth
相关产品推荐
相关产品推荐

