XAML:如何将DependencyProperty绑定到另一个对象上同名的C#属性?

Gra*_*ult 6 wpf xaml dependency-properties

使用:

  • Visual Studio Community Edition 2015
  • .Net 4.0

我已经实现了这个答案,创建了我自己的CheckBox类,完成了一个IsChecked DependencyProperty.该属性由IsCheckedWPF上的属性支持CheckBox,或者如果它可以工作.工作意味着在切换复选框时会调用我的getter和setter.

如果我将我的属性重命名为IsChecked_temp并修改XAML以匹配,它可以正常工作.我认为这是一个命名冲突,但为什么不ElementName解决呢?我的最小测试用例如下.

编辑0:我忘了提,我没有错误或警告.

编辑1:这个答案最初被接受,因为它适用于测试用例,但它显然不是完整的答案.将它应用于我的项目(并将CheckBox类重命名为ToggleBox)会XamlParseException在每次使用属性时产生:

无法在"ToggleBox"类型的"IsChecked"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.

我会试着让一个最小的测试用例来展示这个.

CheckBox.xaml

<UserControl x:Class="CheckBox_test.CheckBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="Self">
    <StackPanel>
        <CheckBox IsChecked="{Binding IsChecked, ElementName=Self}" />
    </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

CheckBox.xaml.cs

using System.Windows;
using System.Windows.Controls;

namespace CheckBox_test
{
    public partial class CheckBox : UserControl
    {
        public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
             "IsChecked",
             typeof(bool),
             typeof(CheckBox),
             new FrameworkPropertyMetadata(false,
                     FrameworkPropertyMetadataOptions.AffectsRender));

        public bool IsChecked
        {
            get { return (bool)GetValue(IsCheckedProperty); }
            set { SetValue(IsCheckedProperty, value); }
        }

        public CheckBox()
        {
            InitializeComponent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml

<Window x:Class="CheckBox_test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CheckBox_test">
    <Grid>
        <local:CheckBox />
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml.cs(完整性)

using System.Windows;

namespace CheckBox_test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

kir*_*tab 1

非常有趣的问题(至少对我来说),所以事实证明,当您注册依赖项属性时,确实存在名称冲突。

我不太确定这是否是一个答案,但我想如果您以前不知道或考虑过它,您会发现这很有趣。

我使用过“CheckBox.IsChecked”,但任何唯一的名称可能就足够了。

public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
         "CheckBox.IsChecked",
         typeof(bool),
         typeof(CheckBox),
         new FrameworkPropertyMetadata(false,
                 FrameworkPropertyMetadataOptions.AffectsRender));
Run Code Online (Sandbox Code Playgroud)

这无需更改您的财产名称即可生效

public bool IsChecked
{
    get
    {
        return (bool)GetValue(IsCheckedProperty);
    }
    set
    {
        SetValue(IsCheckedProperty, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

当您为依赖项属性创建名称时,您必须选择未用于您继承的任何基类中的依赖项属性或事件的唯一名称;否则,在运行时会抛出 ArgumentException。有关依赖项属性和活动绑定的更多信息,请参阅自定义活动绑定示例和简单活动示例。

https://msdn.microsoft.com/en-us/library/vstudio/ms734499(v=vs.90).aspx

再次提醒我我是多么大的菜鸟:)