繁体   English   中英

WPF绑定到变量/ DependencyProperty

[英]WPF Binding to variable / DependencyProperty

我正在玩WPF Binding和变量。 显然,只能绑定DependencyProperties。 我提出了以下内容,它完全正常:代码隐藏文件:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public string Test
    {
        get { return (string)this.GetValue(TestProperty); }
        set { this.SetValue(TestProperty, value); }
        //set { this.SetValue(TestProperty, "BBB"); }
    }
    public static readonly DependencyProperty TestProperty = DependencyProperty.Register(
      "Test", typeof(string), typeof(MainWindow), new PropertyMetadata("CCC"));

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Test);
        Test = "AAA";
        MessageBox.Show(Test);
    }
}

XAML:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="MainWindow" Height="350" Width="525"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,86,0,0" Name="textBox1" VerticalAlignment="Top" Width="152" 
             Text="{Binding Test, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}"/>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="320,85,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,138,0,0" Name="textBox2" Text="{Binding Test, Mode=TwoWay}" VerticalAlignment="Top" Width="152" />
</Grid>

两个TextBoxes另一个更新。 按钮将它们设置为“AAA”。

但是现在我将Setter函数替换为注释掉的函数(模拟对给定值的某些操作)。 我希望每当属性值改变时,它将被重置为“BBB”。 当您按下按钮时,即在代码中设置属性时,它会这样做。 但它确实不会影响WPF Bindings,也就是说你可以改变TextBox内容,从而改变属性,但显然从未调用过Setter。 我想知道为什么会这样,以及如何实现预期的行为。

永远不会保证调用依赖属性的CLR属性包装器,因此,您不应该在那里放置任何其他逻辑。 无论何时在更改DP时需要其他逻辑,都应使用属性更改的回调。

在你的情况下..

public string Test
{
    get { return (string)this.GetValue(TestProperty); }
    set { this.SetValue(TestProperty, value); }
}

public static readonly DependencyProperty TestProperty =
    DependencyProperty.Register("Test",
    typeof(string),
    typeof(MainWindow),
    new PropertyMetadata("CCC", TestPropertyChanged));

private static void TestPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    MainWindow mainWindow = source as MainWindow;
    string newValue = e.NewValue as string;
    // Do additional logic
}

您的更改不会影响绑定,因为XAML将直接调用SetValue,而不是调用属性setter。这是依赖属性系统的工作方式。当注册依赖项属性时,可以指定默认值。此值从GetValue返回并且是您的属性的默认值。

请查看以下链接并阅读Robert Rossney的帖子以获得公平的概述

WPF:依赖属性与常规CLR属性的区别是什么?

也不要错过

http://msdn.microsoft.com/en-us/library/ms753358.aspx

http://msdn.microsoft.com/en-us/library/ms752914.aspx

另请注意,与普通CLR属性不同,您在setter中编写的任何自定义逻辑都不会在依赖项属性中执行,而是必须使用PropertyChangedCallback机制

http://blogs.msdn.com/b/delay/archive/2010/03/23/do-one-thing-and-do-it-well-tip-the-clr-wrapper-for-a-dependencyproperty-应该-DO-其在职和全无,more.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM