14

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

假设一个数据网格有一个 itemssource="List of Players" datacontext="Manager" ,并且有一个组合框作为一种列。我们还假设每个玩家都有一个 Inventory 属性,它是一个集合类型。

然后在datagrid.columns里面:

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

谢谢你

4

2 回答 2

13

要考虑的关键控件是ItemsControlComboBox继承自ItemsControl并且DataGrid行为非常相似)。

AnItemsControl具有ItemsSourcetype 的属性IEnumerable。它也ItemTemplate有财产。它将做的ItemTemplateItemsSource. 的DataContextItemTemplate是 中的每个项目ItemsSource

在您的情况下,ComboBox'列的将是您的对象。如果将 ' 绑定到'库存,那么您将获得' 列表中的每个项目。 需要注意的是of本身是不变的。它仍然是对象。如果您为您的 指定一个,那将是它的库存中的项目。DataContextDataGridPlayerComboBoxItemSourcePlayerComboBox
DataContextComboBoxPlayerItemTemplateComboBoxDataContextPlayer

于 2010-08-19T20:17:28.497 回答
9

它真的很简单。

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 中的 Textblocks,并引用一个单一属性,即 Text。

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

或者让你更简单。

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

希望这可以帮助。

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

于 2010-08-20T16:53:18.740 回答