2009-08-20 58 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

相關問題