Как привязать элемент управления WPF к коду? - PullRequest
2 голосов
/ 21 августа 2009

У меня есть этот XAML:

<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 со свойством кода позади?
Можно ли связать его с результатом метода в коде?

1 Ответ

10 голосов
/ 21 августа 2009

Источником для привязки является RelativeSource.Self. Это означает, что источником является Expander, а не Window. Примерно так будет работать:

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

Вы также можете использовать имя для упрощения вещей:

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