2014-10-02 5 views
0

Я новичок в C# и xaml. Один из методов ниже работает, а другой - нет. Они выглядят одинаково для меня, возвращая ObservableCollection. Если кто-нибудь скажет мне разницу или терминологию, используемую для этих функций, я тоже могу ее найти. Спасибо заранее.xaml binding - разность функций

//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

Первый - это свойство, которое привязано к элементу управления в пользовательском интерфейсе. Когда ваше приложение запускается, метод getter этого свойства будет автоматически запущен и, следовательно, вернет коллекцию.

Второй метод - это метод (а не свойство) и не выполняется автоматически, если вы не вызываете его где-то в вашем коде. Вот почему 2-й не работает.

2

Вы можете привязать только свойства к XAML, и ваш первый «метод» оказывается свойством. Удалите добавочные вызовы из раздела «Входящие», иначе он будет добавлять одни и те же элементы в коллекцию.

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