动态属性与DependencyProperties不能很好地配合使用

本文关键字:很好 属性 DependencyProperties 不能 动态 | 更新日期: 2023-09-27 18:20:41

我的要求是将动态属性绑定到自定义控件的Value(double)属性。但它并没有如预期的那样发挥作用。以下是代码:

简单的客户控制部分:

xaml

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBox x:Name="PART_TextBox" Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

c#

public class CustomControl1 : Control
{

    public double? Value
    {
        get { return (double?)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
    // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(double?), typeof(CustomControl1), new PropertyMetadata(null, new PropertyChangedCallback(OnValueChanged), new CoerceValueCallback(CoerceValueChange)));
    private static object CoerceValueChange(DependencyObject d, object baseValue)
    {
        return baseValue;
    }
    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((CustomControl1)d).OnValueChanged(e);
    }
    private void OnValueChanged(DependencyPropertyChangedEventArgs e)
    {
        if (tb != null && e.NewValue != null)
            tb.Text = e.NewValue.ToString();
        else
            tb.Text = string.Empty;
    }

    static CustomControl1()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
    }
    TextBox tb = null;
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        tb = base.GetTemplateChild("PART_TextBox") as TextBox;
    }
}

用法如下:

xaml

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Column="0">
        <Label Content="Double TextBox without Converter" />
        <Label Content="Double TextBox with Converter" />
        <Label Content="MS TextBox" />
        <Button Content="Button" Click="Button_Click_1"/>
    </StackPanel>
    <StackPanel  Grid.Column="1">
        <cc:CustomControl1 Value="{Binding MyValue}" Height="40" Width="200" Background="Red"/>
        <TextBox Height="30" Text="{Binding MyValue}" />
    </StackPanel>
</Grid>

c#

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private dynamic myValue;
    public dynamic MyValue
    {
        get { return myValue; }
        set { myValue = value; RaisePropertyChanged("MyValue"); }
    }
    public MainWindow()
    {
        InitializeComponent();
        this.myValue = 3;
        this.DataContext = this;
    }
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        this.myValue = 5;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

胁迫的基值始终为null,但如果我在绑定中使用转换器,它将按预期工作。但我想像正常财产一样使用,请帮我一下。

如果我使用TextBox,绑定效果很好,这不是问题所在,我在CustomControl 中使用DP时面临问题

谨致问候,Kumar

动态属性与DependencyProperties不能很好地配合使用

从这里找到答案。。。。。。。。。。。。。。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/7d0f0a90-b0b8-45c9-9ec9-76517c8ea4af/dynamic-property-not-working-well-with-dependencyproperties?forum=wpf