You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:27:36