2009-08-20 60 views
2

我有这样的XAML:如何将WPF控件绑定到后面的代码?

<Window x:Class="WpfBindToCodeBehind.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    Loaded="Window_Loaded"> 
    <StackPanel Orientation="Vertical"> 
     <Button Name="ToggleExpand" Click="ToggleExpand_Click">Toggle Expander</Button> 
     <Expander Name="Expander" 
        Header="Don't click me, click the button!" 
        IsExpanded="{Binding RelativeSource={RelativeSource Self},Path=MayExpand}"> 
      <TextBlock Text="{Binding}"/> 
     </Expander> 
    </StackPanel> 
</Window> 

这是后面的代码:

public partial class Window1 : Window,INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void ToggleExpand_Click(object sender, RoutedEventArgs e) 
     { 
      MayExpand = !mayExpand; 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      Expander.DataContext = "Show me"; 
     } 

     private bool mayExpand; 
     public bool MayExpand 
     { 
      get { return mayExpand; } 
      set 
      { 
       mayExpand = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("MayExpand")); 
      } 
     } 
    } 

为IsExpanded属性的绑定表达式是行不通的。该代码是一种简化,实际上扩展器的绑定已经通过父控件的数据内容设置。
如何将IsExpanded属性绑定到后面的代码的属性?
我可以将它绑定到后面代码中方法的结果吗?

+0

您不能结合直接的方法,同一类或没有。您必须将方法封装为属性调用,或者使用值转换器,或者以其他方式解决该限制。 – 2009-08-20 22:17:47

回答

10

绑定的来源是RelativeSource.Self。这意味着来源是Expander而不是Window。像这样将工作:

IsExpanded="{Binding MayExpand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}" 

你也可以使用一个名称把事情简单化:

<Window x:Name="_root"> 
    <Expander IsExpanded="{Binding MayExpand, ElementName=_root}"/> 
+0

太好了,谢谢你! – Dabblernl 2009-08-21 05:02:41

相关问题