2017-10-18 89 views
0

我有一個簡單的WPF窗口,帶有滑塊和兩個文本塊。隨着滑塊移動,它會更新數據綁定對象。現在第一個文本塊更新,而第二個文本塊不更新。爲什麼?Wpf Databound TextBlock不更新

你可以說這裏沒有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

也許是因爲TheValue從WPF改變,而TheValueTwice是由你的代碼改變。 – Console

回答

1

其實你遇到一個WPF的另一個隱藏的方面,就是它WPF的數據綁定引擎將數據綁定到它包裝源屬性的PropertyDescriptor例如,如果源對象是一個普通的CLR對象,不執行INotifyPropertyChanged接口。數據綁定引擎將嘗試通過PropertyDescriptor.AddValueChanged()方法來訂閱屬性已更改的事件。當目標數據綁定元素更改屬性值時,數據綁定引擎將調用PropertyDescriptor.SetValue()方法將更改後的值傳回給源屬性,同時引發ValueChanged事件以通知其他訂戶(在此情況下,其他用戶將是的TextBlocks列表框內

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