Tai*_*Tai 10 .net c# silverlight silverlight-toolkit silverlight-4.0
我的主要问题是关于在场景中绑定案例我们有多个控件源(数据网格内的组合框)(或者同时具有datacontext和itemssource).那么我们如何知道绑定将使用哪个源?(任何语法澄清)
假设datagrid有一个itemssource ="玩家列表"datacontext ="Manager",并且有一个组合框作为一种列.我们还假设每个玩家都有一个Inventory属性,它是一个集合类型.
然后在datagrid.columns里面:
谢谢
Ste*_*han 10
要考虑的关键控制是ItemsControl (ComboBox继承ItemsControl和DataGrid行为非常相似).
一个ItemsControl具有ItemsSource类型的财产IEnumerable.它也ItemTemplate有财产.它将做的是为每个项目创建一个副本ItemTemplateItemsSource.该DataContext的ItemTemplate会在每个项目ItemsSource.
在你的情况下ComboBox,在DataContext该中DataGrid的列将是你的Player对象.如果你将ComboBox's 绑定ItemSource到一个Player库存,那么你将获得你ComboBox的列表中的每个项目.
需要注意的一点是,DataContext该的ComboBox本身是不变的.它仍然是Player对象.如果您ItemTemplate为自己指定了一个ComboBox,那么它将对库存中DataContext的项目进行指定Player.
它真的很简单.
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 - 根据逻辑设置值.
希望这可以帮助.
如果这回答了你的问题,请将此标记为答案.