我的主要问题是关于场景中的绑定案例我们有多个控件源(数据网格内的组合框)(或者同时具有datacontext和itemssource)。那么我们如何知道绑定将使用哪个源? (任何澄清的语法)
假设datagrid有一个itemssource =“玩家列表”datacontext =“Manager” ,并有一个组合框作为一种列。我们还假设每个玩家都有一个Inventory属性,它是一个集合类型。
然后在datagrid.columns中:
谢谢
答案 0 :(得分:9)
要考虑的关键控制是 ItemsControl
(ComboBox
继承自ItemsControl
,而DataGrid
的行为非常相似。)
ItemsControl
具有ItemsSource
类型的 IEnumerable
属性。它还具有 ItemTemplate
属性。它会做什么为ItemTemplate
中的每个项目创建ItemsSource
的一个副本。 DataContext
的 ItemTemplate
将是ItemsSource
中的每个项目。
对于ComboBox
,DataContext
列的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 - 根据逻辑设置值。
希望这有帮助。
如果这回答了你的问题,请将此标记为答案。