数据绑定从XAML到后面的代码

时间:2011-04-28 20:31:26

标签: c# .net wpf data-binding binding

我在代码后面有这个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); }
}

我想将label的内容绑定到Text属性,以便标签显示Text属性的实际值,反之亦然。

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

我该怎么做?

我之前做过一段时间,但现在我记不起来了 - 这很简单。最简单的代码将被接受。

4 个答案:

答案 0 :(得分:15)

将Window / Control的DataContext设置为同一个类,然后在绑定上指定路径,如下所示:

public class MyWindow : Window {

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

    public string Text { ... }    
}

然后在你的xaml:

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

答案 1 :(得分:12)

您必须设置窗口的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";
    }
}

答案 2 :(得分:1)

当你说它在代码隐藏中时,你的意思是它在你的类窗口的代码中?

您可能希望绑定到祖先类型为Window的RelativeSource。或者,如果尚未设置数据上下文,则在Load事件中,将窗口的DataContext属性设置为窗口本身(this),然后使用{Binding Text}。

答案 3 :(得分:1)

在XAML中将 DataContext 设置为Code-Behind可能有点棘手但通常这些情况最常见:

  1. 您想将 DataContext 设为整个窗口或 自定义 UserControl
  2. <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 设置为self,将使Binding引用Label对象本身而不是Control的Code-Behind。我希望这会有所帮助。