绑定误解没有得到属性设置

时间:2015-10-28 23:15:41

标签: c# wpf xaml

我有以下XAML并尝试在内部的两个标签上实现属性,因此我可以在XAML中实例化控件时设置它们上的标题。在稍后阶段,这也将来自代码。请问您能告诉我关于数据绑定的错误,以及我应该做些什么?我是WPF的新手。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:ctrl="clr-namespace:xCtrl"
        Title="MainWindow" Width="525" ResizeMode="NoResize" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen" WindowStyle="None">
    <Window.Resources>
        <p:Style TargetType="ctrl:BSHintButton" x:Key="BSStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">

                        <Grid x:Name="xgrid" Height="50" Width="500" VerticalAlignment="Top">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="25"/>
                                <RowDefinition Height="25"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="70"/>
                                <ColumnDefinition Width="430
                                                      "/>
                            </Grid.ColumnDefinitions>
                            <Label x:Name="xLabel" Content="{Binding Caption}"
                                   Grid.Column="1" HorizontalAlignment="Left"
                                   Margin="10,8,0,0" VerticalAlignment="Top"
                                   Grid.RowSpan="2" Width="Auto"
                                   FontFamily="Calibri" FontSize="14"
                                   FontWeight="Bold" Height="Auto"/>
                            <Label x:Name="xHint" Content="{Binding HintText}"
                                   Foreground="DarkCyan" Grid.Column="1"
                                   HorizontalAlignment="Left" Height="Auto"
                                   Margin="10,-2,0,0" Grid.Row="1"
                                   VerticalAlignment="Top" Width="Auto"
                                   FontFamily="Calibri" FontSize="14"/>
                            <Rectangle x:Name="xFocus"
                                Stroke="Orange"
                                StrokeThickness="1"
                                RadiusX = "4" RadiusY="4" Grid.RowSpan="2" Grid.ColumnSpan="2" IsEnabled="True" Visibility="Hidden"       
                                       />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver"
                  Value="True">
                                <Setter TargetName="xgrid" Property="Background">
                                    <Setter.Value>
                                        <LinearGradientBrush EndPoint="0.504,1.5" StartPoint="0.504,0.01">
                                            <GradientStop Color="White" Offset="0"/>
                                            <GradientStop Color="Gold"  Offset="0.1"/>
                                            <GradientStop Color="White" Offset="0.8"/>
                                        </LinearGradientBrush>

                                    </Setter.Value>
                                </Setter>
                                <Setter TargetName="xFocus" Property="Visibility"
                   Value="Visible" />

                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="ctrl:OfficeBSHintButton" BasedOn="{StaticResource BSStyle}" />

    </Window.Resources>


    <StackPanel Orientation="Vertical" Margin="0,0,0,0.001">
        <ctrl:BSHintButton x:Name="Button1" Tag ="2" Click="Button1_Click" Caption="caption1" HintText="Hint1">
        </ctrl:BSHintButton>
        <ctrl:BSHintButton x:Name="Button2" Tag ="1" Click="Button1_Click" Caption="caption1" HintText="Hint2">
        </ctrl:BSHintButton>
    </StackPanel>
</Window>

班级代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace xCtrl
{
    public class BSHintButton : Button
    {
        public static readonly DependencyProperty CaptionProperty =
        DependencyProperty.Register("Caption",
                                    typeof(string),
                                    typeof(Label)
                                    );
        public static readonly DependencyProperty HintTextProperty =
        DependencyProperty.Register("HintText",
                                    typeof(string),
                                    typeof(Label)
                                    );
        public string Caption
        {
            get { return (string)GetValue(CaptionProperty); }
            set { SetValue(CaptionProperty, value); }
        }
        public string HintText
        {
            get { return (string)GetValue(HintTextProperty); }
            set { SetValue(HintTextProperty, value); }
        }

    }

}

1 个答案:

答案 0 :(得分:2)

如果没有a good, minimal, complete code example,可能很难或不可能确切地知道问题是什么,更不用说测试解决方案了。但是看一下你的代码,我注意到它最明显的错误就是你正确地声明了你的依赖属性。

依赖项属性的所有者是声明属性的类型,而不是您希望用作绑定目标的类型。

所以你的代码应该是这样的:

    public static readonly DependencyProperty CaptionProperty =
    DependencyProperty.Register("Caption",
                                typeof(string),
                                typeof(BSHintButton)
                                );
    public static readonly DependencyProperty HintTextProperty =
    DependencyProperty.Register("HintText",
                                typeof(string),
                                typeof(BSHintButton)
                                );

拥有错误的所有者可能会阻止WPF正确处理XAML中声明的绑定。我希望和期望修复上面的代码将使绑定工作。

如果没有,请编辑您的问题,以便它包含一个很好的代码示例。没有一个,就不可能举例说明你的具体问题&#34; in situ&#34;,以便正确调试它。

说到调试,你还应养成检查程序调试输出的习惯。当绑定不起作用时,WPF通常会向调试输出发出一条或多条错误消息。有些时候,这些消息甚至是有用的。 :)