【问题标题】:Basic WPF databinding question基本的 WPF 数据绑定问题
【发布时间】:2009-12-18 20:01:24
【问题描述】:

我还有另一个 WPF 数据绑定问题...一个我在任何地方都没有找到答案的问题,这让我感到惊讶,因为它看起来非常基本。

基本上,我的代码中有一个字符串,我想在我的 GUI 中与文本框建立双向绑定。我认为在后面的代码中创建一个 DependencyProperty,然后通过 Source 绑定将其绑定到 TextBox 是一件简单的事情。问题是,我不能把一个或两个部分都弄好。

这是我在后面代码中的 DependencyProperty 定义:

    public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register( "FilePath", typeof(string), typeof(Window1));
    public string FilePath
    {
        get { return (string)GetValue(FilePathProperty); }
        set { SetValue( FilePathProperty, value); }
    }

这是我的 XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ReportingInterface Test Application" Height="300" Width="536">

    <Menu DockPanel.Dock="Top">
        <MenuItem Name="menu_plugins" Header="File">
            <MenuItem Header="Open">
                <StackPanel Orientation="Horizontal">
                    <Label>File location:</Label>
                    <TextBox Name="text_filepath" Width="100" Text="{Binding Source=FilePath, Path=FilePath, Mode=TwoWay}"></TextBox>
                    <Button Margin="3" Width="20">...</Button>
                </StackPanel>
            </MenuItem>
        </MenuItem>
    </Menu>

知道显然是错误的部分是绑定部分...我讨厌在这里浪费人们的时间来回答这个问题,但老实说,我每次搜索都做不到(但至少现在此请求将填充后续的谷歌搜索)。 :)

谢谢!

【问题讨论】:

    标签: wpf data-binding dependency-properties


    【解决方案1】:

    当您在 XAML 中定义绑定时,它会绑定到为对象(或其父对象)设置为 DataContext 的任何内容。

    这通常意味着您将 Window 的 DataContext 设置为某个类,然后绑定将起作用:

    <TextBox Name="text_filepath" Width="100" Text="{Binding Path=FilePath, Mode=TwoWay}" />
    

    您可以通过在 Window 的构造函数中添加来解决此问题:

    this.DataContext = this;
    

    这将使绑定对窗口本身起作用。

    或者,您可以设置绑定以绑定特定的源对象。如果在这种情况下,您希望能够使用其他东西作为 DataContext,但仍想绑定到您的 Window 中定义的依赖属性,您可以这样做:

    <TextBox Name="text_filepath" Width="100" Text="{Binding Path=FilePath, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"></TextBox>
    

    这通过告诉绑定找到“Window”类型的第一个祖先,并将其绑定到该对象的“FilePath”属性来工作。

    【讨论】:

    • 谢谢你,里德!我玩过 DataContext,但仍然有点模糊,无法让它与我当前的项目一起使用。我现在就试一试! :)
    • 是的,宝贝!谢谢,这条神奇的线 this.DataContext.this 就像一个魅力。 :)
    【解决方案2】:

    对于它的价值,我建议研究 M-V-VM 模式(模型、视图、视图模型)——本质上,你所做的就是让这个类充当 XAML 的 DataContext,以及所有有趣的公开属性/commands/你作为该类的公共成员(称为 ViewModel)公开了什么。

    这是一个很好的概述网络广播: MVVM video

    这是来自 MSDN mag 的另一个: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

    【讨论】:

    • MVVM 绝对在我不断增长的学习概念列表中。这对我来说绝对是必须的。
    猜你喜欢
    • 2012-11-08
    • 2011-10-18
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多