2012-03-13 28 views
11

tengo la siguiente propiedad Temp2: (mi control de usuario implementa INotifyPropertyChanged)conjunto de códigos xaml ItemsSource = "{Binding}" con código detrás

ObservableCollection<Person> _Temp2; 
    public ObservableCollection<Person> Temp2 
    { 
     get 
     { 
      return _Temp2; 
     } 
     set 
     { 
      _Temp2 = value; 
      OnPropertyChanged("Temp2"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

Necesito crear una vista de lista de forma dinámica. Tengo la siguiente vista de lista en XAML:

<ListView 
    Name="listView1" 
    DataContext="{Binding Temp2}" 
    ItemsSource="{Binding}" 
    IsSynchronizedWithCurrentItem="True"> 
<ListView.View> 
.... etc 

Ahora estoy tratando de crear la misma vista de lista con C# como:

 ListView listView1 = new ListView(); 
     listView1.DataContext = Temp2; 
     listView1.ItemsSource = Temp2; // new Binding(); // ????? how do I have to implement this line 
     listView1.IsSynchronizedWithCurrentItem = true; 
     //.. etc 

cuando pueblan la vista de lista con C# la vista de lista no quede poblada. ¿Qué estoy haciendo mal?

Respuesta

15

Necesita crear un objeto Binding.

Binding b = new Binding("Temp2") { 
    Source = this 
}; 
listView1.SetBinding(ListView.ItemsSourceProperty, b); 

El argumento pasado al constructor es el Path que estás acostumbrado a partir de fijaciones XAML.

Puede dejar de lado el Path y Source si se establece la DataContext a Temp2 como lo hace encima, pero yo personalmente creo que es preferible obligar a un modelo de vista (u otra fuente de datos) y utilizar un Path que al unirse directamente a un miembro de la clase.

0
listView1.SetBinding(ListView.ItemsSourceProperty, new Binding()); 
+0

¿No funcionó no sé por qué? –

1

Tiene que establecer algunas propiedades de la instancia de enlace. En su caso, probablemente será algo así como ...

listView1.SetBinding(ListView.ItemsSourceProperty, new Binding { Source = Temp2 }); 
Cuestiones relacionadas