2011-06-13 161 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