2011-06-13 127 views
3

我是新来的WPF,我想弄清楚数据绑定是如何工作的,但我没有太多的运气。帮助WPF数据绑定

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

我读了很多关于数据绑定,XML命名空间,标记扩展,资源,依赖项属性和whatnot的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; } 
    } 
} 

我期望的文本框中显示 “你好” 时,该程序启动,但它是空的。

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

+0

如果你读过[数据绑定概述(http://msdn.microsoft.com/en-us/library/ms752347.aspx)你可能本来能够把所有东西都弄出来...... – 2011-06-13 20:43:08

+0

@HB我确实阅读了数据绑定概述以及其他许多MSDN文档页面。实际上,我是在“创建绑定”下的示例中使用我的代码,但它不起作用!他们的所有例子都使用了这个'Grid.Resources'或'DockPanel.Resources'等部分,这些部分只是为我搞定了一些东西。 – HighCommander4 2011-06-13 20:48:35

+0

那么,只要输入一个资源的关键字而不用'StaticResourceExtension'或一个在两种情况下都使'Source'成为一个字符串的类名就是一个常见的错误。您可以通过这种方式在XAML中创建源代码,但不能使用该代码的绑定标记扩展名,而是使用实际的Binding对象,然后您可以使用XML元素语法指定源代码。 – 2011-06-13 20:51:35

回答

1

你需要指定源或者:。

给窗口一个名称,如名称=改变为“myWin”,改变你的绑定WITN的ElementName =改变为“myWin”

或者设置窗口DataContext里ke:

DataContext =“{Binding ElementName =”myWin“} - 你也可以使用RelativeSource,如果你不想要这个名字我就是不能发布它未经测试 - 绑定通常需要测试,因为你也注意到了:)

这可能帮助:

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

+0

工作,谢谢! – HighCommander4 2011-06-13 20:44:26

3

您需要将窗口的DataContext设置为自己。

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

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

每个控件可以设置一个DataContext它说“当我结合,我想绑定到财产在这个特定的实例。这是继承的,所以如果你设置MainWindow本身的DataContext,所有内部控制的MainWindow将绑定到性能上MainWindow

+0

没有帮助...文本框仍然是空的 – HighCommander4 2011-06-13 20:35:14

+0

UPDATE:它可以工作,如果我这样做**和**删除绑定的Source属性,并将其Path路径更改为MyFoo.Bar。 – HighCommander4 2011-06-13 20:39:27

+0

@ HighCommander4:只是要注意,你需要删除源(可以使用的其他来源是'RelativeSource'和'ElementName',如果指定了它将被用来代替DataContext)。 – 2011-06-13 20:41:32