代码改变世界

无废话WPF系列9: Binding的源

2011-02-19 16:45  敏捷的水  阅读(3801)  评论(2编辑  收藏  举报

1. 绑定到其它元素

<Grid>
    <StackPanel>
        <TextBox x:Name="textbox1" />
        <Label Content="{Binding ElementName=textbox1, Path=Text}" />
    </StackPanel>
</Grid>
 

2. 绑定到静态资源

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

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

<Grid x:Name="Grid1">
        <StackPanel>
            <Label x:Name="label1" Content="{Binding RelativeSource={RelativeSource FindAncestor, 
                AncestorType={x:Type Grid}}, Path=Name}" />
        </StackPanel>
</Grid>

 

5. 绑定到对象

public class Person 
   { 
       public string Name { get; set; } 
       public int Age { get; set; } 
   } 
<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. 绑定到集合

public class Person 
    { 
        public string Name { get; set; } 
        public int Age { get; set; } 
    }

    public class PersonList : ObservableCollection<Person> 
    { }
<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 属性时,它会自动寻找上级父元素的数据上下文。

<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:

<?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:

<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> 

后台代码:

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