ItemsSource与绑定案例中的DataContext

Tai*_*Tai 10 .net c# silverlight silverlight-toolkit silverlight-4.0

我的主要问题是关于在场景中绑定案例我们有多个控件源(数据网格内的组合框)(或者同时具有datacontext和itemssource).那么我们如何知道绑定将使用哪个源?(任何语法澄清)

假设datagrid有一个itemssource ="玩家列表"datacontext ="Manager",并且有一个组合框作为一种列.我们还假设每个玩家都有一个Inventory属性,它是一个集合类型.

然后在datagrid.columns里面:

  1. 每列的当前来源(用于绑定)是一个播放器(这是我到目前为止的理解).我们只能绑定到播放器的属性而不是绑定到datacontext"manager"的属性.无法绑定到"Manager"的属性.我对么?
  2. 但是,如果我们移动到组合框列,那么假设我将让combobox的itemssource ='玩家的库存',那么comboboxItem的当前来源将是库存中的每个项目.如果我使用绑定,它只能绑定到这些项的属性.但是,有时我会看到代码,我们也可以绑定到组合框属性中的播放器属性,特别是Selected Value和SelectedItem.我有点困惑,你能帮助我吗?

谢谢

Ste*_*han 10

要考虑的关键控制是ItemsControl (ComboBox继承ItemsControlDataGrid行为非常相似).

一个ItemsControl具有ItemsSource类型的财产IEnumerable.它也ItemTemplate有财产.它将做的是为每个项目创建一个副本ItemTemplateItemsSource.该DataContextItemTemplate会在每个项目ItemsSource.

在你的情况下ComboBox,在DataContext该中DataGrid的列将是你的Player对象.如果你将ComboBox's 绑定ItemSource到一个Player库存,那么你将获得你ComboBox的列表中的每个项目.
需要注意的一点是,DataContext该的ComboBox本身是不变的.它仍然是Player对象.如果您ItemTemplate为自己指定了一个ComboBox,那么它将对库存中DataContext的项目进行指定Player.


Asw*_*nan 7

它真的很简单.

DataContext引用项的相同属性.它没有得到扩展,也没有动态.DataContext适用于当前在父级内部的子级属性.

但是ItemsSource是动态的.它随着源一起扩展.这是一个gud的例子.

这是一个示例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>
Run Code Online (Sandbox Code Playgroud)

这是背后的代码.

 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; }
}
}
Run Code Online (Sandbox Code Playgroud)

如您所见,DataContext适用于StackPanel中存在的Textblock,并引用一个Text属性.

而ItemsSource引用Textblock的Image和Text属性的Source,并且列表中的项目可以与ObservableCollection一起扩展.

或者让它更简单.

DataContext - 根据设计设置值.ItemsSource - 根据逻辑设置值.

希望这可以帮助.

如果这回答了你的问题,请将此标记为答案.