Databind от XAML до кода

У меня есть это свойство зависимости Text в коде позади:

public static DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(MainWindow),
        new PropertyMetadata("Hello world"));

public string Text {
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}

Я хочу привязать содержимое метки к этому свойству Text, чтобы метка отображала фактическое значение свойства Text и наоборот.

<Label Content="{Binding ???}" />

Как я могу это сделать?

Я сделал это некоторое время назад, но теперь я не могу вспомнить, как это сделать, и это очень просто. Простейший код будет принят.

Ответ 1

Установите DataContext вашего Window/Control в тот же класс, а затем укажите путь к привязке, например:

public class MyWindow : Window {

    public MyWindow() {
        InitializeComponents();
        DataContext = this;
    }

    public string Text { ... }    
}

Затем в вашем xaml:

<Label Content="{Binding Path=Text}">

Ответ 2

Вы должны установить DataContext окна для его работы. XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
      <StackPanel>
        <Label Content="{Binding Text}" />
        <Button Content="Click me" Click="HandleClick" />
      </StackPanel>

    </Grid>
</Window>

Code-за:

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new PropertyMetadata("Hello world"));
    public string Text 
    { 
        get { return (string)GetValue(TextProperty); } 
        set { this.SetValue(TextProperty, value); } 
    }

    public MainWindow()
    {
        InitializeComponent();
    }

    protected void HandleClick(object sender, RoutedEventArgs e)
    {
        this.Text = "Hello, World";
    }
}

Ответ 3

Когда вы говорите это в коде, вы имеете в виду это в коде для окна вашего класса?

Возможно, вы захотите привязать к RelativeSource, где тип предка - это Window. В качестве альтернативы, если ваш контекст данных еще не установлен, в вашем событии "Загрузить" установите свойство DataContext окна самому окну (это) и просто используйте {Binding Text}.

Ответ 4

Настройка DataContext в XAML для Code-Behind может быть немного сложной, но в целом эта ситуация наиболее распространена:

  • Вы хотите сделать DataContext все Окно или Пользовательский UserControl

.

<Window
blahhhh..
DataContext={Binding RelativeSource={RelativeSource Mode=Self}}>

или

<UserControl
Blahhhh....
DataContext={Binding RelativeSource={RelativeSource Mode=Self}}>

2. если вы установите DataContext окна или пользовательского элемента управления на что-то другое, кроме кода, расположенного сзади, и у вас есть дочерний элемент управления, вам нужно будет установить его DataContext в Code-Behind you может использовать следующее:

<Label DataContext={Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}/>

для пользовательского UserControl:

<Label DataContext={Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}/>

в этом случае настройка DataContext на себя, приведет к привязке к самому объекту метки, а не к коду управления. Надеюсь, что это поможет.