WPF应用Binding之Path


一、索引器作为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});







  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值