WPF自定义FilterCheckbox组件CBText属性无法识别问题求助
WPF自定义组件依赖属性无法识别问题排查
问题现象
自定义WPF用户控件FilterCheckbox时,已在代码中定义CBText依赖属性,但在MainWindow的XAML里引用组件并设置CBText属性时,出现错误:"The member 'CBText' is not recognized or is not accessible"(成员“CBText”未被识别或无法访问)。尝试修改属性名称后问题依然存在。
问题根源及解决办法
1. 依赖属性注册参数拼写错误
这是核心问题:在FilterCheckbox.cs中注册依赖属性时,propertytype参数拼写错误(正确应为propertyType,首字母T大写)。拼写错误会导致依赖属性注册失败,XAML设计器和运行时均无法识别该属性。
修正代码:
将依赖属性注册代码中的propertytype改为propertyType:
public static readonly DependencyProperty CBTextProperty = DependencyProperty.Register( name: "CBText", propertyType: typeof(string), // 修正首字母大写 ownerType: typeof(FilterCheckbox), typeMetadata: new PropertyMetadata(string.Empty));
2. 清理并重新生成项目
修改代码后,需执行以下步骤消除缓存问题:
- 清理解决方案(Visual Studio:菜单→项目→清理解决方案)
- 重新生成解决方案(菜单→生成→重新生成解决方案)
- 关闭并重新打开XAML编辑器,避免设计器缓存未更新
3. 可选:优化内部绑定方式
原XAML中使用ElementName=root绑定属性,可改为RelativeSource方式,避免依赖控件名称,增强代码健壮性:
<TextBlock x:Name="txt" Text="{Binding CBText, RelativeSource={RelativeSource AncestorType=UserControl}}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green" FontWeight="Bold" Margin="0,5,0,5" />
修正后的完整代码
FilterCheckbox.xaml
<UserControl x:Class="RecipeApp.Components.FilterCheckbox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <UserControl.Resources> <Style x:Key="BorderedCheckBoxStyle" TargetType="CheckBox"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="CheckBox"> <Grid> <!-- Border --> <Border BorderBrush="Black" BorderThickness="2" Background="White"> <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/> </Border> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources> <Grid> <CheckBox IsChecked="False"> <CheckBox.Template> <ControlTemplate TargetType="CheckBox"> <Grid> <Border BorderBrush="Green" BorderThickness="2" Background="White" x:Name="Border" CornerRadius="15,15,15,15" > <TextBlock x:Name="txt" Text="{Binding CBText, RelativeSource={RelativeSource AncestorType=UserControl}}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green" FontWeight="Bold" Margin="0,5,0,5" /> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="Border" Property="Background" Value="Green" /> <Setter TargetName="txt" Property="Foreground" Value="White" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </CheckBox.Template> </CheckBox> </Grid> </UserControl>
FilterCheckbox.cs
using System; using System.Windows; using System.Windows.Controls; namespace RecipeApp.Components { /// <summary> /// Interaction logic for FilterCheckbox.xaml /// </summary> public class FilterCheckbox : UserControl { public string CBText { get { return (string)GetValue(CBTextProperty); } set { SetValue(CBTextProperty, value); } } // 修正了propertyType参数拼写 public static readonly DependencyProperty CBTextProperty = DependencyProperty.Register( name: "CBText", propertyType: typeof(string), ownerType: typeof(FilterCheckbox), typeMetadata: new PropertyMetadata(string.Empty)); public FilterCheckbox() { InitializeComponent(); } } }
MainWindow.xaml(无需修改)
<Window x:Class="RecipeApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:RecipeApp.Components" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="13*"/> <ColumnDefinition Width="67*"/> </Grid.ColumnDefinitions> <StackPanel Background="White" Width="Auto" > <StackPanel.Effect> <DropShadowEffect Color="Black" Opacity="0.505" ShadowDepth="3" /> </StackPanel.Effect> <Label Content="Search" VerticalContentAlignment="Center" Margin="5,0,0,0" HorizontalAlignment="Left"/> <TextBox TextWrapping="Wrap" Text="" Width="116.6" Margin="5,0,5,0" HorizontalAlignment="Left" VerticalAlignment="Center"/> <StackPanel Width="100"/> <StackPanel Height="100" Margin="5,20,5,0"> <local:FilterCheckbox CBText="32wd" /> </StackPanel> </StackPanel> <StackPanel Grid.Column="1" Margin="-4.2,0,0,0" Background="#FFE1EFC9"/> </Grid> </Window>
内容的提问来源于stack exchange,提问作者Brandon Calitz
相关产品推荐
相关产品推荐

