【问题标题】:How to use Custom Dependency Properties directly in WPF?如何在 WPF 中直接使用自定义依赖属性?
【发布时间】:2012-05-10 09:07:19
【问题描述】:

编辑:我根据 Thorstens Answer 使用枚举更改了代码,但没有用。

我正在使用依赖属性来影响我正在创建的 WPF 控件。我是 WPF 新手,所以我不确定自己做错了什么,也找不到合适的文章来解释它。

例如,我试图通过 Dep 属性定义控件的可见性。在这种情况下,属性将是这样的:

public static readonly DependencyProperty IconVisibilityBoldProperty = 
DependencyProperty.Register("IconVisibilityBold", typeof(Visibility), typeof(RTFBox),
new PropertyMetadata(Visibility.Hidden), VisibilityValidateCallback);
private static bool VisibilityValidateCallback(object value)
{
 Visibility prop = (Visibility) value;
 if (prop == Visibility.Hidden || prop == Visibility.Visible)
 {
  return true;
 }
 return false;
}
public Visibility IconVisibilityBold
{
 get
 {
  return (Visibility)GetValue(IconVisibilityBoldProperty);
 }
 set
 {
  SetValue(IconVisibilityBoldProperty, value);
 }
}

编辑: 要获得正确的 XAML,请查找 Slugarts 答案。 用于此的 XAML 条目(在本例中为 ToggleButton)将是

<ToggleButton Visibility="{Binding Path=IconVisibilityBold}" ToolBar.OverflowMode="Never" x:Name="ToolStripButtonBold" Command="EditingCommands.ToggleBold" ToolTip="Bold">
<Image Source="Images\Bold.png" Stretch="None"/>
</ToggleButton>

我已经输出了属性,它显示为“隐藏”,正如元数据默认值所暗示的那样,但显然我在绑定上做错了。我要在那里写什么?

【问题讨论】:

  • 您是在创建新的自定义控件还是用户控件?或者你只是改变了ToggleButton的数据模板?您的属性在哪个类中定义?
  • 我只是想根据属性值隐藏按钮,属性定义在按钮和其他控件所在的同一个类中。 (在本例中名为“RTFBox”

标签: c# wpf data-binding dependency-properties


【解决方案1】:

您试图绑定到父控件的属性而不引用它,它不会被隐式设置。您需要将 ToggleButton 绑定中的 ElementName 设置为您正在创建的 UserControl 的名称(如果它还没有 x:Name 属性,则给它一个 x:Name 属性)。

<UserControl x:Name="rtfBox">
<ToggleButton Visibility="{Binding ElementName=rtfBox, Path=IconVisibilityBold}" ... />
...
</UserControl>

您还应该遵循前面的答案,这些答案正确地指出 Visibility 属性是一个枚举而不是一个字符串。

【讨论】:

  • 所以我假设您的意思是 ?我将如何在绑定中引用父控件?
【解决方案2】:

ToggleButtonVisibility 属性需要System.Windows.Visibility 类型的值。您需要更改代码以使用它而不是字符串:

public static readonly DependencyProperty IconVisibilityBoldProperty = 
DependencyProperty.Register("IconVisibilityBold", typeof(System.Windows.Visibility), typeof(RTFBox));

public System.Windows.Visibility IconVisibilityBold
{
 get
 {
  return (System.Windows.Visibility)GetValue(IconVisibilityBoldProperty);
 }
 set
 {
  SetValue(IconVisibilityBoldProperty, value);
 }
}

【讨论】:

    【解决方案3】:

    所以你的属性是一个字符串...但它必须是一个可枚举的:

    namespace System.Windows
    {
        public enum Visibility : byte
        {
            Visible,
            Hidden,
            Collapsed,
        }
    }
    

    您必须绑定文本框数据上下文或将其用作正确访问属性的参考

    【讨论】:

    • 哎呀,不小心把我的答案写成了评论 :-) 所以你打败了我。
    • 我因此更改了属性: public static readonly DependencyProperty IconVisibilityBoldProperty = DependencyProperty.Register("IconVisibilityBold", typeof(Visibility), typeof(RTFBox), new PropertyMetadata(Visibility.Hidden));但它似乎仍然无法正常工作(setter、getter 和变量相应更改)
    • 我无法返回属性本身,因为它是“DependencyProperty”类型,我必须使用GetValue,而GetValue返回tpye对象,所以我必须强制转换它。
    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多