2016-03-25 18 views
1

Bağlama konseptinde yeniyim ve aşağıdakilerle takılı kaldım.Bağımlılık özelliği UI güncelleştirmiyor

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 özelliğini TextView öğesinin Text özelliğine bağladım. Tek yapmam gereken, butona tıkladığımda, metin kutusu değerini güncellemek zorunda kalacak olan İsim değerini güncellemek istiyorum. Ben normal CLR özelliği yerine bağımlılık özelliğini kullanırsam, INotifyPropertyChanged uygulamak gerekmez, diye düşündüm.

Ancak, kullanıcı arabirimindeki değer beklendiği gibi güncellenmiyor. Bir şey mi eksik?

Şimdiden teşekkürler.

+0

XAML? 'Yi gösterir. – Euphoric

+0

WPF'de TextView gibi bir denetim yoktur. Bu ne kontrol? – Euphoric

+0

Bu, Windows metro uygulaması değil wpf. –

cevap

0

Sorunuzla birlikte ele alınması gereken birkaç şey var. Her şeyden önce, modeliniz DependencyObject devralan gerekmez, daha çok INotifyPropertyChanged uygulamalıdır:

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 ardından sayfa/pencere/nesne bir DependencyProperty olarak kullanılabilir uygulayan bir nesne:

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

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

Son olarak, o zaman, XAML olduğu belirlenirse TextBox.Text özelliği bağlayabilirsiniz:

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

INotifyPropertyChanged hala gerekli h çünkü UI'nin model nesnesinin güncellendiğini bilmesi için bir yol olması gerekir.