2010-08-19 73 views
9

我的主要问题是关于绑定大小写的情况下,我们有一个控件(数据网格内的组合框)(或同时具有datacontext和itemssource)多个来源。那么我们如何知道绑定将使用哪个源? (任何语法来澄清)ItemsSource与DataContext绑定的情况下

假设一个数据网格有一个itemssource =“球员列表”datacontext =“经理” ,并有一个组合框作为一种列。我们还假定每个玩家都有一个库存属性,这是一个集合类型。

则datagrid.columns内:

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

谢谢

回答

8

关键控制想想是ItemsControl(从ItemsControlComboBox继承和DataGrid行为非常相似)。

ItemsControlItemsSource类型IEnumerable的财产。它还具有属性ItemTemplate属性。它会做什么是创建它的一个副本ItemTemplate为每个项目在ItemsSourceItemTemplateDataContext将是ItemsSource中的每个项目。

对于您的情况ComboBoxDataGrid的列中的DataContext将是您的Player对象。如果您将ComboBoxItemSource绑定到Player的广告资源,那么您将在您的ComboBox的列表中获得每件商品。
需要注意的是ComboBox本身的DataContext本身没有变化。它仍然是Player对象。如果您为ComboBox指定ItemTemplate,那么的库存中的物品就是DataContext

+0

对于SelectedValue SelectedItem,如果我们有绑定,那么它将绑定到组合框的datacontext属性(而不是组合框的itemssource中每个项目的属性)。所以它是播放器的属性,现在是组合框的数据上下文 对于SelectedValuePath,DisplayMemberPath:我们不使用标记语法将值分配给它们,因此它基本上没有绑定。这就是为什么我们仍然可以在itemssource中分配项目属性的名称(而不是datacontext的属性)。我对吗? – Tai 2010-08-19 22:08:23

6

它非常简单。

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中和是指一个单独的属性,该属性是文本的的TextBlocks。

而ItemsSource指的是Textblock的Image和Text属性的来源,并且列表中的项目可以与ObservableCollection一起扩展。

或者让它变得更简单。

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

希望这会有所帮助。

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

+0

嗨Aswin,谢谢你的帮助。我理解你的例子,但我想问的是同一控件(datagrid与combobox列内的情况下)同时具有itemssource和datacontext的情况。我认为斯蒂芬的回答清除了我大部分的困惑。 你的答案也是有帮助的。谢谢 – Tai 2010-08-20 19:10:30

+0

它也是一样的。如果你有一个带有两个文本块的列表框,就像我在示例中所说的那样。您可以使用DataContext来绑定数据。如果它的子控件有不同的控件,那么使用ItemsSource将是最好的选择。两者都是在不同情况下使用的DataBinding现象。 – 2010-08-20 22:03:36

相关问题