ItemsSource与绑定案例中的DataContext

时间:2010-08-19 19:19:49

标签: c# .net silverlight silverlight-4.0 silverlight-toolkit

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

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

然后在datagrid.columns中:

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

2 个答案:

答案 0 :(得分:9)

要考虑的关键控制是 ItemsControl ComboBox继承自ItemsControl,而DataGrid的行为非常相似。)

ItemsControl具有ItemsSource类型的 IEnumerable 属性。它还具有 ItemTemplate 属性。它会做什么ItemTemplate 中的每个项目创建ItemsSource的一个副本。 DataContext ItemTemplate将是ItemsSource 中的每个项目。

对于ComboBoxDataContext列的DataGrid将是您的Player对象。如果您将ComboBox的{​​{1}}与ItemSource的广告资源绑定,那么您将获得Player列表中的每个项目。
需要注意的是ComboBox本身的 DataContext不变。它仍然是ComboBox对象。如果您为Player指定了ItemTemplate,那么ComboBox库存中的商品就会DataContext

答案 1 :(得分: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>

这是背后的代码。

 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中存在的Textblock,并引用一个Text文本。

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

或者让你更简单。

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

希望这有帮助。

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