2009-08-20 6 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 не работает. Этот код является упрощением, на самом деле привязка экспандера уже задана через datacontent родительского элемента управления.
Как я могу привязать свойство IsExpanded к свойству кода позади?
Могу ли я привязать его к результату метода в коде позади?

+0

Вы не можете связываться с методами непосредственно, или же класса нет. Вы должны инкапсулировать метод в качестве вызова свойства или использовать конвертер значений или иначе использовать ограничение. –

ответ

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

Смежные вопросы