Wpf数据绑定TextBlock未更新

时间:2017-10-18 05:08:31

标签: wpf

我有一个带滑块和两个文本块的简单WPF窗口。当滑块移动时,它会更新数据绑定对象。现在第一个文本块更新,而第二个文本块没有。为什么?

你可能会说这里没有INotifyPropertyChanged。但那么为什么第一次更新呢?我已经拉了我的头发。请帮忙。

我的WPF应用程序的所有荣耀如下。

<Window x:Class="DataTriggerDemo.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:DataTriggerDemo"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Slider x:Name="MySlider" Margin="5" Minimum="0" Maximum="100"
                    Value="{Binding TheValue}"/>
        <TextBlock Grid.Row="1" Text="{Binding TheValue}" />
        <TextBlock Grid.Row="2" Text="{Binding TheValueTwice}" />
    </Grid>
</Window>

现在是背后的代码。

using System.Windows;
namespace DataTriggerDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new DataObject();
        }
    }

    public class DataObject
    {
        private int _theValue;
        public int TheValue
        {
            get { return _theValue; }
            set {
                _theValue = value;
                TheValueTwice = _theValue * 2;
            }
        }
        private int _theValueTwice;
        public int TheValueTwice
        {
            get {
                return _theValueTwice;
            }
            set {
                _theValueTwice = value;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

实际上你遇到了WPF的另一个隐藏方面,那就是WPF的数据绑定引擎将数据绑定到PropertyDescriptor实例,如果源对象是普通的CLR对象并且没有& #39; t实现INotifyPropertyChanged接口。数据绑定引擎将尝试通过PropertyDescriptor.AddValueChanged()方法订阅属性更改事件。当目标数据绑定元素更改属性值时,数据绑定引擎将调用PropertyDescriptor.SetValue()方法将更改后的值传回源属性,并且它将同时引发ValueChanged事件以通知其他订阅者(在本例中,其他订阅者将是ListBox中的TextBlock。

请参阅:https://social.msdn.microsoft.com/Forums/vstudio/en-US/9365bb6a-b411-4967-9a03-ae2a810fb215/data-binding-without-inotifypropertychanged?forum=wpf