WPF数据绑定帮助

4

我对WPF很陌生,正试图理解数据绑定,但没有太大进展。

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

我阅读了许多MSDN文档页面,包括数据绑定、XML命名空间、标记扩展、资源、依赖属性等,但仍无法使其工作。

以下是我的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”,但它是空的。 有人能告诉我我做错了什么吗?

如果你已经阅读了数据绑定概述,你可能已经能够自己解决所有问题了... - H.B.
@H.B. 我确实阅读了数据绑定概述,以及许多其他的MSDN文档页面。事实上,我是基于“创建绑定”下的示例来编写代码的,但它并没有起作用!他们所有的示例都使用了Grid.ResourcesDockPanel.Resources等部分,这只会让事情变得混乱。 - HighCommander4
诚然,仅仅输入资源的键而没有使用StaticResourceExtension或类名是一个常见的错误,在这两种情况下都会将Source变成字符串。顺便说一下,您可以在XAML中创建自己的源,但不能使用绑定标记扩展,而是要使用实际的绑定对象,然后可以在XML元素语法中指定源。 - H.B.
2个回答

3
你需要将窗口的 DataContext 属性设置为自身。
public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    MyFoo = new Foo { Bar = "hello" };
}

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

每个控件都可以设置一个DataContext,它表示“当我进行绑定时,我想要绑定到特定实例上的属性...”这是继承的,因此如果将MainWindowDataContext设置为其本身,则MainWindow内部的所有控件都将绑定到MainWindow上的属性。


没有帮助...文本框仍然为空。 - HighCommander4
更新:如果我这样做并且删除绑定的“Source”属性,并将其“Path”更改为“MyFoo.Bar”,它就可以工作。 - HighCommander4
@HighCommander4:刚想提醒您需要删除源代码(其他可用的源包括RelativeSourceElementName,如果指定了任何一个,它将被用于替代DataContext)。 - H.B.
@HighCommander4:是的,源代码覆盖了DataContext。很抱歉我没有在其中发现这个问题。 - Reed Copsey
@HighCommander4:你看过资源概述了吗? - H.B.
显示剩余2条评论

1

你需要指定来源。可以选择以下方式之一:

给窗口命名,例如Name="mywin",然后使用ElementName="myWin"修改你的绑定。

或者像这样设置窗口的DataContext:

DataContext="{Binding ElementName="myWin"}" - 如果你不想使用名称,也可以使用RelativeSource。不过我没有测试过,绑定通常需要测试,就像你注意到的那样 :)

这可能会有所帮助:

http://blogs.msdn.com/b/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接