wpf 自定义控件的自定义属性的数据绑定问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf 自定义控件的自定义属性的数据绑定问题相关的知识,希望对你有一定的参考价值。

问题是这样的:
我自定义了一个控件 contorl1 里面有个属性
public static readonly DependencyProperty ColumnCountProperty= DependencyProperty.Register("ColumnCount", typeof(int), typeof(contorl1), new PropertyMetadata(1));
public int ColumnCount

get return (int)this.GetValue(ColumnCountProperty);
set this.SetValue(ColumnCountProperty, value);

然后呢,我在mainform里面
有一个属性 public int LeftColumnCount//此处定义个上面类似就不重复了。
最后
我要把contorl1.ColumnCount绑定到LeftColumnCount上。
换句话说就是两个都是自定义属性,之间的绑定
ColumnCount="Binding Path=LeftColumnCount, Mode=TwoWay
然后就报错了
不能在“contorl1”类型的“ColumnCount”属性上设置“Binding”。只能在 DependencyObject 的 DependencyProperty 上设置“Binding”。
在线等,速度哦,亲....

参考技术A Binding的时候加一个 elementname 指定绑定的元素,或许可行本回答被提问者采纳

WPF 中的自定义设计时可见性属性

【中文标题】WPF 中的自定义设计时可见性属性【英文标题】:Custom design time visibility attribute in WPF 【发布时间】:2021-08-15 08:17:42 【问题描述】:

我有一个复杂的窗口,其中包含基于布尔值可见或折叠的各种控件。我想添加一个自定义属性以在设计时显示所有这些控件。 我的属性实现如下所示:

public static class CustomAttributes

    private static bool? _inDesignMode;

    public static readonly DependencyProperty Visibility = DependencyProperty.RegisterAttached(
        "Visibility",
        typeof(Visibility),
        typeof(CustomAttributes),
        new PropertyMetadata(VisibilityChanged));

    private static bool InDesignMode
    
        get
        
            if (!_inDesignMode.HasValue)
            
                var prop = DesignerProperties.IsInDesignModeProperty;
                _inDesignMode =
                  (bool)DependencyPropertyDescriptor.FromProperty(prop, typeof(FrameworkElement)).Metadata.DefaultValue;
            

            return _inDesignMode.Value;
        
    

    public static Visibility GetVisibility(DependencyObject dependencyObject)
    
        return (Visibility)dependencyObject.GetValue(Visibility);
    

    public static void SetVisibility(DependencyObject dependencyObject, Visibility value)
    
        dependencyObject.SetValue(Visibility, value);
    

    private static void VisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    
        if (!InDesignMode)
            return;

        d.SetValue(Control.VisibilityProperty, e.NewValue);
    

在 XAML 中我这样使用它:

<Button Visibility="Binding SomeBoolValue, Converter=StaticResource BoolToVisibility"
        helper:CustomAttributes.Visibility="Visible" 
/>

但是,它似乎不起作用。我使用了一些像这样的其他自定义属性,它们完成了它们的工作,但不会触发可见性,它只是在设计视图中保持折叠状态。我错过了什么?

编辑:

感谢您为我指明了正确的方向。我的问题的解决方案不需要我最初假设的自定义属性。为了实现我想要的设计时行为,我按照下面接受的答案中的建议修改了转换器实现。

【问题讨论】:

另一种方式——使用多重绑定***.com/questions/2959885/… 【参考方案1】:

更深入地思考您创建的逻辑。

UI 元素没有两个可见性属性,它是唯一的一个。 但是您想同时以两种方式操作此属性:通过绑定和附加属性。 因此,您在他们之间为该房产创造了竞争。 该属性将采用最后分配给它的值。

附加属性只会在 Button 初始化时触发一次(来自示例)。 当数据上下文和/或其SomeBoolValue 属性更改时,将触发绑定。 但是Window的Data Context设置晚于这个Window的UI元素的初始化。

我看到了几种解决方案。 如果您需要始终在设计模式下显示元素,最简单的方法是向转换器添加适当的逻辑。 以最简单的形式,此类转换器的示例:

/// <summary>Bool to Visibility converter.</summary>
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BooleanToVisibilityConverter : IValueConverter

    public static bool IsDesignMode  get;  = DesignerProperties.GetIsInDesignMode(new DependencyObject());

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        if (value is bool val)
            return IsDesignMode || val 
                ? Visibility.Visible
                : Visibility.Collapsed;

        return DependencyProperty.UnsetValue;
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        throw new NotImplementedException();
    

【讨论】:

以上是关于wpf 自定义控件的自定义属性的数据绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

wpf中动态添加的自定义控件过宽,不能完全显示,怎么办

具有依赖属性绑定到 DockPanel.Dock 附加属性的 WPF 自定义控件不起作用

在 WPF C# 中无法访问用户控件的自定义属性

定义要绑定的自定义属性

WPF自定义控件数据绑定出现的问题

我的 WPF 自定义控件 Datacontext 正在取代父母