2010-08-19 14 views
9

Mi pregunta principal es vinculante sobre el caso de la unión en la escena que tenemos múltiples fuentes para un control (un cuadro combinado dentro de una cuadrícula de datos) (o tener tanto DataContext y ItemsSource). Entonces, ¿cómo podemos saber qué fuente utilizará el enlace? (cualquier sintaxis para aclarar eso)ItemsSource vs DataContext en el caso

Suponiendo que una cuadrícula de datos tiene un elementssource = "Lista de jugadores" datacontext = "Manager" , y tiene un combobox como un tipo de columna. También suponemos que cada jugador tiene una propiedad de inventario que es un tipo de colección.

continuación, dentro de las datagrid.columns:

  1. La fuente de corriente de cada columna (para la unión) es un jugador (así es como yo lo entiendo hasta ahora). Solo podemos enlazar a la propiedad del jugador no a la propiedad del "administrador" de contexto de datos. No hay forma de enlazar a la propiedad del "Administrador". ¿Estoy en lo correcto?
  2. Sin embargo, si nos movemos a las columnas combobox, a continuación, asumir dejaré que ItemsSource del cuadro combinado = inventario 'jugador 's', entonces la fuente de corriente para ComboBoxItem será cada elemento en el inventario. Y si uso el enlace, solo puede enlazar a la propiedad de esos elementos. Sin embargo, a veces veo el código que también podemos vincular a la propiedad del jugador dentro de la propiedad del combobox, especialmente Selected Value y SelectedItem. Estoy un poco confundido aquí ¿me pueden ayudar?

que

Respuesta

8

las gracias a la tecla de control que pensar es un ItemsControl (ComboBox hereda de ItemsControl y la DataGrid se comporta muy similar).

Un ItemsControl tiene ItemsSource propiedad de tipo IEnumerable. También tiene la propiedad ItemTemplate. Lo que hará es crear una copia de su ItemTemplate para todos los elementos de ItemsSource. El DataContext del ItemTemplate habrá cada elemento de la ItemsSource.

En el caso de la ComboBox, la DataContext de la columna de DataGrid 's será su Player objeto. Si vincula el ComboBox 's ItemSource al inventario Player, obtendrá cada artículo en la lista ComboBox.
Lo que hay que tener en cuenta es que el DataContext del ComboBox no ha cambiado. Sigue siendo el objeto Player. Si especifica un ItemTemplate para su ComboBox, eso es lo que tendrá es DataContext para los artículos en un inventario de Player.

+0

Para SelectedValue, SelectedItem, si tenemos binding, se enlazará a la propiedad del contexto de datos del combobox (no la propiedad de cada elemento en el ítem source del combobox). Por lo tanto, es la propiedad del Reproductor que es el contexto de datos del cuadro combinado ahora Para SelectedValuePath, DisplayMemberPath: no usamos la Sintaxis de marcado para asignarles el valor, por lo que no es básicamente vinculante. Es por eso que todavía podemos asignar el nombre de la propiedad del artículo en su fuente de artículos (no la propiedad del contexto de datos). Estoy en lo correcto? – Tai

6

Su realmente simples.

DataContext se refiere a la misma propiedad de los elementos. No se extiende y no es dinámico. DataContext se aplica a las propiedades de los niños que se encuentran actualmente dentro del elemento principal.

Pero ItemsSource es dinámico. Se extiende junto con la fuente. Aquí hay un ejemplo de gud.

Esta es una muestra xaml.

<UserControl x:Class="SilverlightApplication" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.Resources>   
     <DataTemplate x:Key="template2"> 
      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="img1" Source="{Binding Image}"></Image> 
       <TextBlock x:Name="data2" Text="{Binding Data}"></TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </Grid.Resources> 
    <StackPanel> 
     <StackPanel x:Name="DataContextStack" Orientation="Vertical"> 
      <TextBlock x:Name="data1" Text="{Binding Text1}"></TextBlock> 
      <TextBlock x:Name="data2" Text="{Binding Text2}"></TextBlock> 
     </StackPanel> 
     <ListBox x:Name="lst2" ItemTemplate="{StaticResource template2}"></ListBox> 
    </StackPanel> 
</Grid> 

Este es el código atrás.

namespace SilverlightApplication 
{ 
    public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
     loadLists(); 
    } 

    private void loadLists() 
    { 
     ObservableCollection<Temp2> tColl = new ObservableCollection<Temp2>();    

     Temp1 t1 = new Temp1(); 
     t1.Text1 = "DataContext1"; 
     t1.Text2 = "DataContext2";    

     tColl.Add(new Temp2() { Image = "", Data = "Item1" }); 
     tColl.Add(new Temp2() { Image = "", Data = "Item2" }); 


     DataContextStack.DataContext = t1; 
     lst2.ItemsSource = tColl;    
    } 
} 

public class Temp1 
{ 
    public string Text1 { get; set; } 
    public string Text2 { get; set; } 



} 

public class Temp2 
{ 
    public string Image { get; set; } 
    public string Data { get; set; } 
} 
} 

Como se puede ver, el DataContext se aplica a los Textblock que existen en el StackPanel y se refieren a una única propiedad que es texto.

Considerando que ItemsSource se refiere a la fuente de la propiedad de imagen y texto del bloque de texto y los elementos dentro de la lista se pueden extender junto con el ObservableCollection.

O para hacerlo aún más simple para usted.

DataContext - El valor se establece según el diseño. ItemsSource - El valor se establece en función de la lógica.

Espero que esto ayude.

Marque esta como respuesta, si esto responde a su pregunta.

+0

Hola Aswin, gracias por tu ayuda. Entiendo su ejemplo, pero lo que quiero preguntar es el caso de tener ambos elementos fuente y contexto de datos para el mismo control (el caso de la cuadrícula de datos con la columna del cuadro combinado dentro). Creo que la respuesta de Stephan aclara la mayor parte de mi confusión. su respuesta también es útil también. Gracias – Tai

+0

Es lo mismo. Si tiene un cuadro de lista con 2 bloques de texto como dije en el ejemplo. Puede usar DataContext para enlazar los datos. En caso de que tenga controles diferentes como sus hijos, entonces el uso de ItemsSource sería la mejor opción. Ambos son un fenómeno de DataBinding utilizado en diferentes escenarios. –

Cuestiones relacionadas