一、索引器作为Binding的Path:
<TextBox x:Name="TextBox_1"/>
<!--使用TextBox_1的Text(索引器)作为Path-->
<TextBox x:Name="TextBox_2" Text="{Binding Path=Text[3], ElementName=TextBox_1, Mode=OneWay}"/>
二、当数据为集合或DataView时,把它默认的元素作为Path
(1) XAML代码:
<TextBox x:Name="textBox1"/>
<TextBox x:Name="textBox2"/>
<TextBox x:Name="textBox3"/>
(2) C#代码:
List<string> stringList = new List<string>() { "Tim", "Tom", "Andy" };
textBox1.SetBinding(TextBox.TextProperty, new Binding("/") { Source = stringList });
textBox2.SetBinding(TextBox.TextProperty, new Binding("/Length") { Source = stringList, Mode = BindingMode.OneWay });
textBox3.SetBinding(TextBox.TextProperty, new Binding("/[2]") { Source = stringList, Mode = BindingMode.OneWay });
三、集合元素的属性仍然为集合时:
(1) XAML代码:
同上
(2) C#代码
public class City
{
public string Name { get; set; }
}
public class Province
{
public string Name { get; set; }
public List<City> CityList { get; set; }
}
public class Country
{
public string Name { get; set; }
public List<Province> ProvinceList { get; set; }
}
City cn_c1 = new City() { Name = "广州" };
City cn_c2 = new City() { Name = "深圳" };
Province cn_province1 = new Province() { Name = "广东" };
cn_province1.CityList = new List<City>();
cn_province1.CityList.Add(cn_c1);
cn_province1.CityList.Add(cn_c2);
Country china = new Country() { Name = "中国" };
china.ProvinceList = new List<Province>();
china.ProvinceList.Add(cn_province1);
List<Country> countryList = new List<Country>();
countryList.Add(china);
textBox1.SetBinding(TextBox.TextProperty, new Binding("/Name") { Source = countryList });
textBox2.SetBinding(TextBox.TextProperty, new Binding("/ProvinceList/Name") { Source = countryList });
textBox3.SetBinding(TextBox.TextProperty, new Binding("/ProvinceList/CityList/Name") { Source = countryList });
四、数据为集合,数据的属性仍然为集合(例:ListBox嵌套显示国家->省份->城市)
(一) 方式一
1. XMAL
<ScrollViewer x:Name="listbox_root" VerticalScrollBarVisibility="Auto">
<!--国家-->
<ListBox x:Name="listbox_country" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" Background="Red" Padding="5">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="50,0,0,0">
<!--省份-->
<ListBox ItemsSource="{Binding Path=ProvinceList}" Background="Green" IsSynchronizedWithCurrentItem="True" Padding="5">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="50,0,0,0">
<!--城市-->
<ListBox ItemsSource="{Binding Path=CityList}" Background="Blue" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
2. C#后台代码
public MainWindow()
{
InitializeComponent();
init();
}
void init()
{
City cn_c1 = new City() { Name = "广州" };
City cn_c2 = new City() { Name = "深圳" };
City cn_c3 = new City() { Name = "东莞" };
Province cn_province1 = new Province() { Name = "广东" };
cn_province1.CityList = new ObservableCollection<City>();
cn_province1.CityList.Add(cn_c1);
cn_province1.CityList.Add(cn_c2);
cn_province1.CityList.Add(cn_c3);
Country china = new Country() { Name = "中国" };
china.ProvinceList = new ObservableCollection<Province>();
china.ProvinceList.Add(cn_province1);
City usa_gz1 = new City() { Name = "洛杉矶" };
City usa_gz2 = new City() { Name = "旧金山" };
City usa_gz3 = new City() { Name = "首府" };
Province usa_province_gz = new Province() { Name = "加州" };
usa_province_gz.CityList = new ObservableCollection<City>();
usa_province_gz.CityList.Add(usa_gz1);
usa_province_gz.CityList.Add(usa_gz2);
//usa_province_gz.CityList.Add(usa_gz3);
Country usa = new Country() { Name = "USA" };
usa.ProvinceList = new ObservableCollection<Province>();
usa.ProvinceList.Add(usa_province_gz);
ObservableCollection<Country> countrys = new ObservableCollection<Country>();
countrys.Add(china);
countrys.Add(usa);
listbox_root.DataContext = countrys;//设置DataContext
}
public class City
{
public string Name { get; set; }
}
public class Province
{
public string Name { get; set; }
public ObservableCollection<City> CityList { get; set; }
}
public class Country
{
public string Name { get; set; }
public ObservableCollection<Province> ProvinceList { get; set; }
}
(二) 方式二
1.XAML
与方式一的不同之处1:定义资源
<Window.Resources>
<local:CountryList x:Key="dataSrc"/>
</Window.Resources>
与方式一的不同之处2:在XAML中设置DataContext(其他不变)
<ScrollViewer x:Name="listbox_root" VerticalScrollBarVisibility="Auto">
<!--国家-->
<ListBox x:Name="listbox_country" DataContext="{Binding Source={StaticResource dataSrc}}" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" Background="Red" Padding="5">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="50,0,0,0">
<!--省份-->
<ListBox ItemsSource="{Binding Path=ProvinceList}" Background="Green" IsSynchronizedWithCurrentItem="True" Padding="5">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="50,0,0,0">
<!--城市-->
<ListBox ItemsSource="{Binding Path=CityList}" Background="Blue" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
2. C#后台代码
与方式一的不同之处3:多定义了一个CountryList集合类
public class CountryList : ObservableCollection<Country>
{
public CountryList()
:base()
{
City cn_gd1 = new City() { Name = "广州" };
City cn_gd2 = new City() { Name = "深圳" };
City cn_gd3 = new City() { Name = "东莞" };
Province cn_province_gd = new Province() { Name = "广东" };
cn_province_gd.CityList = new ObservableCollection<City>();
cn_province_gd.CityList.Add(cn_gd1);
cn_province_gd.CityList.Add(cn_gd2);
//cn_province_gd.CityList.Add(cn_gd3);
City cn_hn1 = new City() { Name = "三亚" };
City cn_hn2 = new City() { Name = "海口" };
City cn_hn3 = new City() { Name = "五指山" };
Province cn_province_hn = new Province() { Name = "海南" };
cn_province_gd.CityList.Add(cn_hn1);
cn_province_gd.CityList.Add(cn_hn2);
//cn_province_gd.CityList.Add(cn_hn3);
Country china = new Country() { Name = "中国" };
china.ProvinceList = new ObservableCollection<Province>();
china.ProvinceList.Add(cn_province_gd);
china.ProvinceList.Add(cn_province_hn);
Add(china);
City usa_gz1 = new City() { Name = "洛杉矶" };
City usa_gz2 = new City() { Name = "旧金山" };
City usa_gz3 = new City() { Name = "首府" };
Province usa_province_gz = new Province() { Name = "加州" };
usa_province_gz.CityList = new ObservableCollection<City>();
usa_province_gz.CityList.Add(usa_gz1);
usa_province_gz.CityList.Add(usa_gz2);
//usa_province_gz.CityList.Add(usa_gz3);
Country usa = new Country() { Name = "USA" };
usa.ProvinceList = new ObservableCollection<Province>();
usa.ProvinceList.Add(usa_province_gz);
Add(usa);
}
}
public class City
{
public string Name { get; set; }
}
public class Province
{
public string Name { get; set; }
public ObservableCollection<City> CityList { get; set; }
}
public class Country
{
public string Name { get; set; }
public ObservableCollection<Province> ProvinceList { get; set; }
}
五、数据源本身就是数据(int、string)
Path为一个点"."或省略Path
1. xaml代码:
1-1: 定义资源
<Grid.Resources>
<sys:String x:Key="myString">
纯文本测试
</sys:String>
</Grid.Resources>
1-2: 使用/绑定资源
<StackPanel>
<TextBox x:Name="textBoxNoPath" Text="{Binding Path=., Source={StaticResource ResourceKey=myString}}"/>
</StackPanel>
(2) C#代码,使用C#代码数据绑定时,不能省略点("."),
string myString = "文本测试";
textBoxNoPath.SetBinding(TextBox.TextProperty, new Binding(".") {Source = myString});