上次讲到数据模板的绑定(DataTemplate),今天在这基础上我进行了延伸。下面我们把数据绑定到ObjectDataProvider上。
ObjectDataProvider:包装和创建可以用作绑定源的对象。
首先我们先设定一些数据。
先看下结果图吧。
新建一个Data.cs类。
我们在里面新建6个类,看类图吧。
这里League是哪个国家的队,Division是这个国家队有哪些地方队组成,Team是某一个具体的队。
让我们看下具体代码:
代码 /// <summary>
/// 这个国家队的某个地方的队
/// </summary>
public class Team
{
public Team(string name)
{
Name = name;
}
public string Name { get; set; }
}
/// <summary>
/// 这个国家队的某个地方的队集合
/// </summary>
public class TeamList:List<Team>
{
public TeamList()
: base()
{ }
}
/// <summary>
/// 这个国家队来自哪里的
/// </summary>
public class Division
{
public string Name { get; set; }
public TeamList Teams { get; set; }
public Division(string name)
{
this.Name = name;
Teams = new TeamList();
}
}
/// <summary>
/// 这个国家队的集合
/// </summary>
public class DivisionList:List<Division>
{
public DivisionList()
: base()
{ }
}
/// <summary>
/// 哪个国家的队
/// </summary>
public class League
{
public string Name { get; set; }
public DivisionList Divisions { get; set; }
public League(string name)
{
this.Name = name;
Divisions = new DivisionList();
}
}
/// <summary>
/// 所有队及类型
/// </summary>
public class LeagueList:List<League>
{
public LeagueList() : base() {
League l;
Division d;
l = new League("中国队");
Add(l);
d = new Division("中国北方队");
l.Divisions.Add(d);
d.Teams.Add(new Team("中国北方1号队"));
d.Teams.Add(new Team("中国北方2号队"));
d.Teams.Add(new Team("中国北方3号队"));
d.Teams.Add(new Team("中国北方4号队"));
d.Teams.Add(new Team("中国北方5号队"));
d = new Division("中国南方队");
l.Divisions.Add(d);
d.Teams.Add(new Team("中国南方1号队"));
d.Teams.Add(new Team("中国南方2号队"));
d.Teams.Add(new Team("中国南方3号队"));
d.Teams.Add(new Team("中国南方4号队"));
d.Teams.Add(new Team("中国南方5号队"));
l = new League("美国队");
Add(l);
d = new Division("美国北方队");
l.Divisions.Add(d);
d.Teams.Add(new Team("美国北方1号队"));
d.Teams.Add(new Team("美国北方2号队"));
d.Teams.Add(new Team("美国北方3号队"));
d.Teams.Add(new Team("美国北方4号队"));
d.Teams.Add(new Team("美国北方5号队"));
d = new Division("美国南方队");
l.Divisions.Add(d);
d.Teams.Add(new Team("美国南方1号队"));
d.Teams.Add(new Team("美国南方2号队"));
d.Teams.Add(new Team("美国南方3号队"));
d.Teams.Add(new Team("美国南方4号队"));
d.Teams.Add(new Team("美国南方5号队"));
}
}
数据准备好了。我们看MainWindow.xaml。
代码<Window.Resources>
<ObjectDataProvider x:Key="odp" ObjectType="{x:Type src:LeagueList}">
</ObjectDataProvider>
<DataTemplate x:Key="dataList">
<TextBlock Text="{Binding Path=Name}" FontSize="32" />
</DataTemplate>
</Window.Resources>
这里我们需要引入xmln的命名空间
xmlns:src="clr-namespace:Demo"
下面我们在用DataTemplate来绑定具体的名字。这里我们可以对ListBox中的字体来设置他的属性。
代码<DockPanel Width="660" Height="400" DataContext="{StaticResource odp}">
<TextBlock DockPanel.Dock="Top" FontSize="32" HorizontalAlignment="Center"
FontWeight="Bold" Text="比赛队伍详情" />
<DockPanel DockPanel.Dock="Left" Margin="10 0 10 0">
<TextBlock DockPanel.Dock="Top" FontSize="32"
FontWeight="Black" Text="哪个国家的队"/>
<ListBox ItemsSource="{Binding }" IsSynchronizedWithCurrentItem="True"
ItemTemplate="{StaticResource dataList}">
</ListBox>
</DockPanel>
<DockPanel DockPanel.Dock="Left" Margin="10 0 10 0">
<TextBlock DockPanel.Dock="Top" FontSize="32"
FontWeight="Black" Text="{Binding Path=Name}"/>
<ListBox ItemsSource="{Binding Divisions}" IsSynchronizedWithCurrentItem="True"
ItemTemplate="{StaticResource dataList}">
</ListBox>
</DockPanel>
<DockPanel DockPanel.Dock="Left" Margin="10 0 10 0">
<TextBlock DockPanel.Dock="Top" FontSize="32"
FontWeight="Black" Text="{Binding Divisions/Name}"/>
<ListBox ItemsSource="{Binding Divisions/Teams}"
ItemTemplate="{StaticResource dataList}">
</ListBox>
</DockPanel>
</DockPanel>
这里我们要设置ListBox的 IsSynchronizedWithCurrentItem="True" 属性。
获取或设置指示 Selector 是否应当使 SelectedItem 与 Items 属性中的当前项保持同步的值。
这样按F5就可以运行了。