C# 自定义控件,绑定到代码隐藏

C# 自定义控件,绑定到代码隐藏,c#,wpf,C#,Wpf,无法绑定到自定义控件的代码隐藏中的数据。显然,我必须使用Generic.xaml来设置控件的样式,并且我希望绑定到控件UserProfile.cs中的数据 这就是背后的代码: using System; using System.Windows; using System.Windows.Controls; namespace Controls { public class UserProfile : Control { static UserProfile()

无法绑定到自定义控件的代码隐藏中的数据。显然,我必须使用
Generic.xaml
来设置控件的样式,并且我希望绑定到控件
UserProfile.cs
中的数据

这就是背后的代码:

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

namespace Controls
{
    public class UserProfile : Control
    {
        static UserProfile()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(UserProfile), 
                new FrameworkPropertyMetadata(typeof(UserProfile)));
        }

        private Double _ProfilePhotoSize = 50;
        private Double ProfilePhotoSize
        {
            get { return _ProfilePhotoSize; }
            set
            {
                if (_ProfilePhotoSize != value)
                    _ProfilePhotoSize = value;
            }
        }
    }
}
这是带有绑定的XAML,删除了最后一部分,因为它不需要:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Controls">

    <Style TargetType="{x:Type local:NumericUpDown}">
        <Style.Resources>
            <SolidColorBrush x:Key="colour1" Color="#434953" />
            <SolidColorBrush x:Key="colour2" Color="#22252b" />
            <SolidColorBrush x:Key="colour3" Color="#606876" />
        </Style.Resources>

        <Setter Property="Width" Value="85" />
        <Setter Property="Margin" Value="5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:NumericUpDown}">
                    <Border Focusable="{TemplateBinding Focusable}"
                            Width="{TemplateBinding Width}"
                            x:Name="Border">
                        <Grid Focusable="False">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="1*"/>
                                <ColumnDefinition Width="auto"/>
                            </Grid.ColumnDefinitions>

                            <Button x:Name="PART_DecreaseButton" 
                                    Grid.Column="0">
                                <Button.Content>
                                    <Path Data="M0,0 L1,0 0.5,1Z"
                                          Fill="White"
                                          Width="8"
                                          Height="6"
                                          Stretch="Fill"/>
                                </Button.Content>
                                <Button.Template>
                                    <ControlTemplate TargetType="Button">
                                        <Border Name="Border"
                                                Background="{DynamicResource colour1}" 
                                                Width="25" 
                                                Height="25"
                                                CornerRadius="5 0 0 5">
                                            <ContentPresenter />
                                        </Border>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter TargetName="Border" Property="Background" Value="{DynamicResource colour3}" />
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>

                            <TextBox x:Name="PART_TextBox"
                                     Grid.Column="1"
                                     Foreground="White"
                                     Background="{DynamicResource colour2}"
                                     VerticalContentAlignment="Center"
                                     HorizontalContentAlignment="Center"
                                     HorizontalAlignment="Stretch" 
                                     BorderThickness="0"
                                     Focusable="False" Text="0" />

                            <Button x:Name="PART_IncreaseButton" 
                                    Grid.Column="2">
                                <Button.Content>
                                    <Path Data="M0,1 L1,1 0.5,0Z" 
                                          Width="8"
                                          Height="6"
                                          Fill="White" 
                                          Stretch="Fill" />
                                </Button.Content>
                                <Button.Template>
                                    <ControlTemplate TargetType="Button">
                                        <Border Name="Border" 
                                                Background="{DynamicResource colour1}" 
                                                Width="25" 
                                                Height="25"
                                                CornerRadius="0 5 5 0">
                                            <ContentPresenter />
                                        </Border>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter TargetName="Border" Property="Background" Value="{DynamicResource colour3}" />
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{x:Type local:UserProfile}">
        <Setter Property="DataContext" Value="{x:Type local:UserProfile}" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="FontSize" Value="16" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:UserProfile}">
                    <Grid x:Name="circleGrid" Width="{Binding Path=ProfilePhotoSize, RelativeSource={RelativeSource AncestorType={x:Type local:UserProfile}}}">
...
这是XAML,绑定不再工作:S

XAML

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Controls">

    <Style TargetType="{x:Type local:UserProfile}">
        <Setter Property="DataContext" Value="{x:Type local:UserProfile}" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="FontSize" Value="16" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:UserProfile}">
                    <Grid x:Name="circleGrid" Width="{Binding ProfilePhotoSize, RelativeSource={RelativeSource AncestorType={x:Type local:UserProfileData}}}">
                        <Grid.RowDefinitions>

将其更改为公共属性

    private Double _ProfilePhotoSize = 50;
    public Double ProfilePhotoSize
    {
        get { return _ProfilePhotoSize; }
        set
        {
            if (_ProfilePhotoSize != value)
                _ProfilePhotoSize = value;
        }
    }

这是一个多么愚蠢的错误,我甚至没想到去检查一下。。谢谢嘿,不用担心。我为此浪费了半小时的次数…>不过,这种情况不会再发生了,我在属性中使用了一个代码段,这可能很有用:P不确定,但DataContext设置为UserProfile-是否应该设置为UserProfileData?不确定,但这是我最好的猜测?我当时不知道,对不起:(
    private Double _ProfilePhotoSize = 50;
    public Double ProfilePhotoSize
    {
        get { return _ProfilePhotoSize; }
        set
        {
            if (_ProfilePhotoSize != value)
                _ProfilePhotoSize = value;
        }
    }