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”。
在线等,速度哦,亲....
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 自定义控件的自定义属性的数据绑定问题的主要内容,如果未能解决你的问题,请参考以下文章