WPF 数据绑定帮助

问题描述 投票:0回答:2

我是 WPF 新手,我正在尝试弄清楚数据绑定是如何工作的,但我运气不太好。

我尝试从简单的事情开始 - 将文本框的内容绑定到程序中的字符串变量。

我阅读了很多关于数据绑定、XML 命名空间、标记扩展、资源、依赖属性等等的 MSDN 文档,但我仍然无法让它工作。

这是我的 MainWindow.xaml:

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:WpfTest"
        Title="MainWindow">
    <Grid>
        <Grid.Resources>
            <c:Foo x:Key="MyFoo"/>
        </Grid.Resources>
        <TextBox Width="100" Height="28"
                 Text="{Binding Source=MyFoo,
                                Path=BarProperty,
                                Mode=TwoWay,
                                UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>

还有我的 MainWindow.xaml.cs:

namespace WpfTest
{
    public class Foo : DependencyObject
    {
        public static readonly DependencyProperty BarProperty = DependencyProperty.Register("Bar", typeof(String), typeof(Foo));

        public String Bar
        {
            get { return (String)GetValue(BarProperty); }
            set { SetValue(BarProperty, value); }
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MyFoo = new Foo { Bar = "hello" };
        }

        public Foo MyFoo { get; set; }
    }
}

我希望程序启动时文本框会显示“hello”,但它是空的。

有人可以告诉我我做错了什么吗?

c# wpf xaml data-binding
2个回答
3
投票

您需要将窗口的

DataContext
设置为自身。

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    MyFoo = new Foo { Bar = "hello" };
}

这告诉 WPF 在您的类中查找绑定。

每个控件都可以设置一个

DataContext
,它表示“当我绑定时,我想绑定到此特定实例上的属性...这是继承的,因此如果将
DataContext
MainWindow
设置为自身,
MainWindow
内的所有控件都将绑定到
MainWindow
上的属性。


1
投票

您需要注明来源。要么:

为窗口命名,例如 Name="mywin",用 ElementName="myWin" 更改绑定

或者设置窗口 DataContext 如下:

DataContext="{Binding ElementName="myWin"} - 如果您不想要该名称,您也可以使用相对源,我只是无法未经测试地发布它 - 正如您也注意到的那样,绑定往往需要测试:)

© www.soinside.com 2019 - 2024. All rights reserved.