使用:
- Visual Studio Community Edition 2015
- .Net 4.0
我已经实现了这个答案,创建了自己的CheckBox
类,并添加了一个IsChecked
DependencyProperty
。该属性由WPF CheckBox
上的IsChecked
属性支持,但是如果工作正常的话,它将调用我的getter和setter函数。
如果我将我的属性重命名为IsChecked_temp
并修改XAML以匹配,则可以正常工作。我认为这是一个命名冲突,但为什么ElementName
不能解决它?以下是我的最小测试用例。
编辑0:我忘记提到,我没有收到任何错误或警告。
编辑1:这个答案最初被接受是因为它适用于测试用例,但显然不是完整的答案。将其应用于我的项目(并将CheckBox
类重命名为ToggleBox
)会在每次使用该属性时产生XamlParseException
:
无法在DependecyObject的依赖属性“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>
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();
}
}
}
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>
MainWindow.xaml.cs (for completeness)
using System.Windows;
namespace CheckBox_test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
UserControl
和自定义控件的用法,这两个概念完全不同,旨在解决不同的使用情况。 - Federico Berasategui