分享

无废话WPF系列9: Binding的源

 贾朋亮博客 2013-08-23

1. 绑定到其它元素

1
2
3
4
5
6
<Grid>
    <StackPanel>
        <TextBox x:Name="textbox1" />
        <Label Content="{Binding ElementName=textbox1, Path=Text}" />
    </StackPanel>
</Grid>
 

2. 绑定到静态资源

1
2
3
4
5
6
7
8
9
<Window.Resources>
        <ContentControl x:Key="text">Hello, World!</ContentControl>
</Window.Resources>
<Grid>
    <StackPanel>
        <Label x:Name="label1" Content="{Binding Source={StaticResource text}}" />
    </StackPanel>
</Grid>
<strong>3. 绑定到自身</strong>
1
2
3
4
5
<Grid>
    <StackPanel>
        <Label x:Name="label1" Content="{Binding RelativeSource={RelativeSource Self}, Path=Name}" />
    </StackPanel>
</Grid>

4. 绑定到指定类型的父元素

1
2
3
4
5
6
<Grid x:Name="Grid1">
        <StackPanel>
            <Label x:Name="label1" Content="{Binding RelativeSource={RelativeSource FindAncestor,
                AncestorType={x:Type Grid}}, Path=Name}" />
        </StackPanel>
</Grid>

 

5. 绑定到对象

1
2
3
4
5
public class Person
   {
       public string Name { get; set; }
       public int Age { get; set; }
   }
1
2
3
4
5
6
7
8
<StackPanel x:Name="stackPanel">
        <StackPanel.DataContext>
            <local:Person Name="Jack" Age="30"></local:Person>
        </StackPanel.DataContext>
        <TextBlock  Text="{Binding Path=Name}"></TextBlock>
        <TextBlock Text="{Binding Path=Age}"></TextBlock>       
 
</StackPanel>

6. 绑定到集合

1
2
3
4
5
6
7
8
public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
 
    public class PersonList : ObservableCollection<Person>
    { }
1
2
3
4
5
6
7
8
9
10
11
<Window.Resources>
       <local:PersonList x:Key="person">
           <local:Person Name="Jack" Age="30"></local:Person>
           <local:Person Name="Tom" Age="32"></local:Person>
       </local:PersonList>
   </Window.Resources>
   <StackPanel x:Name="stackPanel">
       <ListBox  ItemsSource="{Binding Source={StaticResource ResourceKey=person}}"
                  DisplayMemberPath="Name">           
       </ListBox>
</StackPanel>

 

7. DataContext共享源

我们需要将同一资源绑定到多个 UI 元素上,很显然到处写 "{Binding Source={StaticResource person}}" 是件很繁琐且不利于修改的做法。WPF 提供了一个称之为 "数据上下文 (DataContext)" 的东西让我们可以在多个元素上共享一个源对象,只需将其放到父元素 DataContext 属性即可。当我们不给 Binding 扩展标志指定 Source 属性时,它会自动寻找上级父元素的数据上下文。

1
2
3
4
5
6
7
8
9
10
11
<Window.Resources>
        <local:PersonList x:Key="person">
            <local:Person Name="Jack" Age="30"></local:Person>
            <local:Person Name="Tom" Age="32"></local:Person>
        </local:PersonList>
    </Window.Resources>
    <StackPanel x:Name="stackPanel" DataContext="{StaticResource person}">
        <ListBox  ItemsSource="{Binding}"
                   DisplayMemberPath="Name">           
        </ListBox>
    </StackPanel>

 

8. 使用XML作为Binding的源

XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8" ?>
<PersonList>
  <Person Id="1">
    <Name>Jack</Name>
  </Person>
  <Person Id="2">
    <Name>Tom</Name>
  </Person>
  <Person Id="3">
    <Name>Justin</Name>
  </Person>
  <Person Id="4">
    <Name>David</Name>
  </Person>
</PersonList>

XAML:

1
2
3
4
5
6
7
8
9
10
11
12
13
<StackPanel>
       <ListView x:Name="personListView">
           <ListView.View>
               <GridView>
                   <GridViewColumn Header="Id" Width="100"
                                    DisplayMemberBinding="{Binding XPath=@Id}"/>
                   <GridViewColumn Header="Name" Width="100"
                                    DisplayMemberBinding="{Binding XPath=Name}"/>
               </GridView>
           </ListView.View>
       </ListView>   
       <Button Click="Button_Click">Load Data</Button>
   </StackPanel>

后台代码:

1
2
3
4
5
6
7
8
9
10
11
12
private void Button_Click(object sender, RoutedEventArgs e)
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load("Person.xml");
 
            XmlDataProvider xdp = new XmlDataProvider();
            xdp.Document = xmlDocument;
            xdp.XPath = @"/PersonList/Person";
 
            this.personListView.DataContext = xdp;
            this.personListView.SetBinding(ListView.ItemsSourceProperty, new Binding());
        }
image

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多