2016-03-25 134 views
1

我是綁定概念的新手,陷入以下困境。不更新UI的依賴屬性

public sealed partial class MainPage : Page 
{ 
    Model model; 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     model = new Model(); 

     this.DataContext = model; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     model.Name = "My New Name"; 
    } 
} 

class Model : DependencyObject 
{ 
    public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Model), new PropertyMetadata("My Name")); 

    public string Name 
    { 
     get { return (string)GetValue(NameProperty); } 
     set { SetValue(NameProperty, value); } 
    }  
} 

我已經將Name屬性綁定到TextView的Text屬性。我需要做的就是在按鈕上單擊我想更新名稱值,該值必須更新文本框的值。我想,如果我使用依賴屬性而不是正常的CLR屬性,我不需要實現INotifyPropertyChanged。

但是,UI中的值未按預期更新。我錯過了什麼嗎?

在此先感謝。

+0

顯示XAML?.. – Euphoric

+0

WPF中沒有TextView這樣的控件。那是什麼控制? – Euphoric

+0

這是Windows metro應用程序不是wpf。 –

回答

0

有幾件事情需要解決您的問題。首先,你的模型不需要自DependencyObject繼承,而是應該執行INotifyPropertyChanged:

public class Model : INotifyPropertyChanged 
{ 
    string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

實現然後INotifyProperty可以作爲在你的頁面/窗/對象一個DependencyProperty對象:

public static readonly DependencyProperty ModelProperty = DependencyProperty.Register("Model", 
     typeof(Model), typeof(MainWindow)); 

    public Model Model 
    { 
     get { return (Model)GetValue(ModelProperty); } 
     set { SetValue(ModelProperty, value); } 
    } 

最後的話,您可以將您TextBox.Text屬性綁定到在XAML:

<Grid> 
    <StackPanel Orientation="Vertical"> 
     <TextBox Text="{Binding Name}"/> 
     <Button Click="Button_Click">Click</Button> 
    </StackPanel> 
</Grid> 

的INotifyPropertyChanged的仍然是必要的^ h因爲需要讓UI知道模型對象已被更新。