ItemsSource vs DataContext в случае связывания - PullRequest
10 голосов
/ 19 августа 2010

Мой основной вопрос касается связывающего случая в сцене, когда у нас есть несколько источников для элемента управления (комбинированный список внутри сетки данных) (или имеющего как datacontext, так и itemssource).Тогда как мы можем узнать, какой источник будет использовать привязка?(любой синтаксис, чтобы уточнить это)

Предполагая, что сетка данных имеет itemssource = "Список игроков" datacontext = "Manager", и имеет в качестве своего рода столбец комбинированный список.Мы также предполагаем, что у каждого игрока есть свойство Inventory, которое является типом коллекции.

затем внутри datagrid.columns:

  1. Текущий источник каждого столбца (для привязки) являетсяПлеер (это я так понимаю).Мы можем связать только свойство игрока, а не свойство datacontext "manager".Нет возможности привязать к свойству «Менеджер».Я прав?
  2. Тем не менее, если мы перейдем к столбцам комбинированного списка, то предположим, что я позволю элементу combobox itemssource = 'инвентарь игрока', тогда текущим источником для comboboxItem будет каждый элемент инвентаря.И если я использую связывание, оно может связываться только со свойством этих предметов.Однако иногда я вижу код, который мы также можем привязать к свойству проигрывателя внутри свойства комбинированного списка, особенно Selected Value и SelectedItem.Я немного запутался, вы можете мне помочь?

спасибо

Ответы [ 2 ]

10 голосов
/ 20 августа 2010

Ключевой элемент управления, о котором следует подумать: ItemsControl (ComboBox наследует от ItemsControl, а DataGrid ведет себя очень похоже).

ItemsControlItemsSource свойство типа IEnumerable.Он также имеет свойство ItemTemplate.Он будет создавать одну копию ItemTemplate для каждого элемента в ItemsSource.DataContext из ItemTemplate будет каждым элементом в ItemsSource.

В вашем случае ComboBox, DataContext из DataGrid 'Столбец s будет вашим Player объектом.Если вы привяжете ComboBox ItemSource к инвентарю Player, то вы получите каждый предмет из списка ComboBox.
Следует отметить, что DataContext самого ComboBox не изменяется .Это все еще объект Player.Если вы укажете ItemTemplate для своего ComboBox, то это будет DataContext для предметов в инвентаре Player.

7 голосов
/ 20 августа 2010

Это действительно просто.

DataContext относится к тому же свойству элементов. Он не расширяется и не является динамическим. DataContext применяется к дочерним свойствам, которые в данный момент находятся внутри родительского объекта.

Но ItemsSource является динамическим. Это расширяется вместе с источником. Вот пример гуд.

Это образец 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>

Вот код позади.

 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; }
}
}

Как вы видите, DataContext применяется к текстовым блокам, которые существуют в StackPanel и ссылаются на одно единственное свойство, которое является Text.

Принимая во внимание, что ItemsSource ссылается на Source свойства Image и Text текстового блока, и элементы в списке могут быть расширены вместе с ObservableCollection.

Или чтобы вам было еще проще.

DataContext - значение устанавливается в зависимости от дизайна. ItemsSource - значение устанавливается на основе логики.

Надеюсь, это поможет.

Отметьте это как ответ, если он ответил на ваш вопрос.

...