正在将CustomControl绑定到自己的属性

本文关键字:自己的 属性 绑定 CustomControl | 更新日期: 2023-09-27 18:20:24

我在这件事上疯了。。。我试图为我的控件提供定义自己颜色的简单功能。

我的控制:

这是我的xaml:

<Grid>
    <Grid.Resources>
        <ControlTemplate x:Key="starTemplate" TargetType="{x:Type ToggleButton}">
            <Viewbox>
                <Path x:Name="star"
                      Data="F1 M 145.637,174.227L 127.619,110.39L 180.809,70.7577L 114.528,68.1664L 93.2725,5.33333L 70.3262,67.569L 4,68.3681L 56.0988,109.423L 36.3629,172.75L 91.508,135.888L 145.637,174.227 Z"
                      Fill="LightGray" />
            </Viewbox>
            <ControlTemplate.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter TargetName="star" Property="Fill" Value="Yellow" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <ToggleButton Grid.Column="0"
                  Click="RatingButtonClickEventHandler"
                  Cursor="Hand"
                  Tag="1"
                  Template="{StaticResource starTemplate}" />
    <ToggleButton Grid.Column="1"
                  Click="RatingButtonClickEventHandler"
                  Cursor="Hand"
                  Tag="2"
                  Template="{StaticResource starTemplate}" />
    <ToggleButton Grid.Column="2"
                  Click="RatingButtonClickEventHandler"
                  Cursor="Hand"
                  Tag="3"
                  Template="{StaticResource starTemplate}" />
    <ToggleButton Grid.Column="3"
                  Click="RatingButtonClickEventHandler"
                  Cursor="Hand"
                  Tag="4"
                  Template="{StaticResource starTemplate}" />
    <ToggleButton Grid.Column="4"
                  Click="RatingButtonClickEventHandler"
                  Cursor="Hand"
                  Tag="5"
                  Template="{StaticResource starTemplate}" />
</Grid>

现在,当我像Fill="{Binding Path=UnselectedColor"一样绑定Path.Fill属性时,我需要将控件的DataContext指定给它自己:

public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.RegisterAttached("SelectedColor", typeof(Brush), typeof(RatingControl), new UIPropertyMetadata(new SolidColorBrush(Colors.Yellow)));
    public RatingControl()
    {
        InitializeComponent();
        DataContext = this;
    }

这会起作用,我可以从控件中定义颜色,但它会破坏任何其他绑定。

从自定义控件返回到我的实现:

例如,以下代码将设置SelectedColorUnselectedColor,但RatingValue="{Binding Path=Rating}的绑定将失败,因为它试图绑定到我的RatingControl中的属性Rating,而不是ViewModel中的属性。

<my:RatingControl Grid.Row="0"
                  Grid.Column="0"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Center"
                  IsReadOnly="True"
                  RatingValue="{Binding Path=Rating,
                                        TargetNullValue='0.0',
                                        Mode=TwoWay}"
                  SelectedColor="Orange"
                  ToolTip="Bewertung"
                  UnselectedColor="LightGray" />

这就是绑定错误。Extension是我的ViewModel中的一个属性,它包含我试图绑定的属性Rating

System.Windows.Data错误:40:BindingExpression路径错误:在"object"Extension"(HashCode=24138614)"上找不到"UnselectedColor"属性。BindingExpression:Path=UnselectedColor;DataItem="扩展"(HashCode=24138614);目标元素为"Path"(名称=");目标属性为"Fill"(类型为"Brush")

正在将CustomControl绑定到自己的属性

您以错误的方式设置DataContext。请阅读创建可重复使用的用户控件的简单模式。

简而言之,它应该是

<Grid x:Name="LayoutRoot">

public RatingControl()
{
    InitializeComponent();
    LayoutRoot.DataContext = this;
}

当您执行此时

public RatingControl()
{
    InitializeComponent();
    DataContext = this;
}

您将RatingControlDataContext绑定到其自身,并且您控件上的每个数据绑定,如果以后没有更改DataContext,将绑定到RateControl级绑定不起作用(RatingControl中没有评分)。我认为您应该删除RatingControl的构造函数中的DataContext = this;,并尝试在RateControlXAML上使用以下代码将Fill属性绑定到RatingControl的SelectedColor特性:

Fill="{Binding ElementName=<nameOfRatingControl>, SelectedColor}"

此链接将帮助您了解有关dataBinding的概述:http://www.wpftutorial.net/DataBindingOverview.html.希望得到帮助。

当需要绑定到self时,可以使用Binding.RelativeSource属性。

另请参阅:

  • RelativeSource MarkupExtension
  • 数据绑定概述