2010-08-02 73 views
1

我有图像和文本块的项目模板。和文本块绑定到名称属性。一切工作正常,而我不想更新我的数据。当我在树中设置我的源节点新名称时,我看到了旧名称。如何更新项目模板内的文本?Silverlight更新绑定

<my:TreeView.ItemTemplate> 
     <toolkit:HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Icon}" Width="20" Height="20" /> 
       <TextBlock Text="{Binding Name}" Height="20" TextAlignment="Center" HorizontalAlignment="Center" /> 
      </StackPanel> 
     </toolkit:HierarchicalDataTemplate> 
    </my:TreeView.ItemTemplate> 
+0

添加新的属性是改变我的控制数据的唯一方法? 我可以使用像refreshBinding();或自定义刷新数据? – Evgeny 2010-08-02 13:23:00

回答

2

您与Name属性类必须实现System.ComponentModel.INotifyPropertyChanged接口通知到该属性值已经改变了WPF UI。像下面这样:

class MyClass : System.ComponentModel.INotifyPropertyChanged 
{ 
    private String _name; 
    public String Name 
    { 
     get { return _name; } 
     set { _name = value; RaisePropertyChanged("Name"); } 
    } 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
    protected void RaisePropertyChanged(String propertyName) 
    { 
     System.ComponentModel.PropertyChangedEventHandler temp = PropertyChanged; 
     if (temp != null) 
     { 
      temp(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
2

Name属性看起来可能看起来是这样的: -

public class MyClass 
{ 
    public string Name {get; set; } 
} 

然而,你需要一种方法来通知属性已经改变,使UI可以更新自己的UI 。这是INotifyPropertyChanged接口的目的: -

public class MyClass : INotfyPropertyChanged 
{ 
    string _name; 
    public string Name 
    { 
     get {return _name; } 
     set { _name = value; NotifyPropertyChanged("Name"); } 
    } 

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

有了实现此接口的绑定,只要绑定属性更改将更新UI的价值。

1

使“名称”为依赖属性。它具有内置的更改通知功能。

+2

仅当绑定对象是FrameworkElement时才有效。 – 2010-08-02 12:51:48