Привязка данных из XAML к коду - PullRequest
11 голосов
/ 29 апреля 2011

У меня есть это 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 ???}" />

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

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

Ответы [ 4 ]

15 голосов
/ 29 апреля 2011

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

public class MyWindow : Window {

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

    public string Text { ... }    
}

Тогда в вашем xaml:

<Label Content="{Binding Path=Text}">
12 голосов
/ 29 апреля 2011

Вы должны установить 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>

Код-за:

/// <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";
    }
}
1 голос
/ 21 апреля 2017

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

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

.

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

или

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

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

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

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

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

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

1 голос
/ 29 апреля 2011

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

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

...