2014-10-02 92 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