2014-10-02 50 views
0

我是新来的C#和xaml。下面的一种方法工作,另一种方法不适用。他们看起来和我一样,都返回ObservableCollection。 如果有人告诉我用于这些功能的差异或术语,我也可以查找它。请提前感谢您。xaml绑定 - 函数差异

//This one works when binded with xaml and displays the 

     public ObservableCollection<Emp> Items 
     { 
      get 
      { 

       collection.Add(new Emp { Name = "Emp1", Age = 21 }); 
       collection.Add(new Emp { Name = "Emp2", Age = 22 }); 
       return collection; 

      } 
     } 

//This one does not work 

    public ObservableCollection<Emp> collection = new ObservableCollection<Emp>(); 
      public ObservableCollection<Emp> Items() 
      { 


       collection.Add(new Emp { Name = "Emp1", Age = 21 }); 
       collection.Add(new Emp { Name = "Emp2", Age = 22 }); 
       return collection; 
      } 



    <!-- XAML CODE --> 
    <Grid> 
     <ListBox Margin="20" ItemsSource="{Binding Items}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Name}" /> 
         <TextBlock Text="{Binding Path=Age}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

回答

1

第一个属性绑定到UI上的控件。当您的应用程序启动时,该属性的getter方法将自动被触发,因此将返回该集合。

第二个是一个方法(不是一个属性),除非你从代码中的某处调用它,否则不会自动执行。这就是为什么第二个不起作用。

2

您只能将属性绑定到XAML,并且您的第一个“方法”碰巧是属性。从get部分删除添加的调用,否则它将继续添加相同的项目到集合。

http://csharp.net-tutorials.com/csharp-3.0/automatic-properties/也检出自动属性。

当绑定属性将发生变化时,您需要实现INotifyPropertyChanged,否则XAML不知道它应该更新绑定。 http://msdn.microsoft.com/en-us/library/vstudio/ms229614%28v=vs.100%29.aspx

酷招是使用[CallerMemberName]属性,您不必每次都指定属性名称作为参数。

protected void OnPropertyChanged([CallerMemberName] string name = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
+0

谢谢你们俩! – Ozland 2014-10-02 23:16:54