2010-02-23 80 views
21

我試圖得到一個標籤的內容綁定到一個類實例的字符串屬性沒有多少成功。WPF:綁定標籤的類屬性

XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W1}" VerticalAlignment="Top" /> 

    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W2}" VerticalAlignment="Top" /> 

    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" 
      Name="button1" VerticalAlignment="Bottom" Width="89" 
      Click="button1_Click"> 
     Set Properties 
    </Button> 

</Grid> 
</Window> 

C#:

namespace WPFBindingTest 
{ 
    public partial class Window1 : Window 
    { 
     public Foo MyFoo; 

     public Window1() 
     { 
      InitializeComponent();    

      MyFoo = new Foo();   
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     {  
      MyFoo.W1 = "Hello"; 
      MyFoo.W2 = "Dave"; 
     } 
    } 

    public class Foo 
    { 
     public string W1 { get; set; } 
     public string W2 { get; set; } 
    } 
} 

即當我按一下按鈕,我設置MyFoo爲 「Hello」 和 「戴維」 的性質,並希望這體現在UI上的標籤。我已經將內容設置爲綁定,但某些內容不正確。我在這裏做錯了什麼?

回答

18

你可以讓你的MyFoo依賴項屬性和設置DataContextWindow1實例:

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ...> 

有關詳細信息,請參閱本article

製作MyFoo依賴屬性不是強制性的。如果你之前設置屬性值分配DataContext它可能只是一個物業工作。 (但從來沒有一個領域。)但是,如果你想要的標籤,拿起W1W2變化值(或者你不知道/關心,如果值是前或分配DataContect後置),你需要Foo到或者是DependencyObject,或者執行界面INotifyPropertyChanged

+1

謝謝,這個我指出了正確的方向。 Made Foo實現了INotifyPropertyChanged,然後將Window1的DataContext設置爲包含MyFoo的BindingList 的DataContext。標籤的內容現在是: {綁定路徑= W1,UpdateSourceTrigger =的PropertyChanged} 和它的作品一種享受! – Gareth 2010-02-23 11:31:57

+1

@Vlad使用'DependencyProperty'和實現'INotifyPropertyChanged'或者這應該是它本身的問題? – ywm 2013-08-01 14:18:04

+0

@ymw:這是一個不同的問題,其實相當大。簡而言之:將二者只是結合工作,但'INotifyPropertyChanged'更輕盈,'DependencyProperty'但是如果不使用,可用於動畫,樣式,模板不走記憶,繼承(從父容器所含元素)等等。看看例如[這個答案](http://stackoverflow.com/a/3674530/276994)。 – Vlad 2013-08-01 16:59:29

6

或者給你的窗口名稱:像NameOfWindow和使用的ElementName綁定:

Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" 

完整的示例XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Name="NameOfWindow">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" /> 
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W2}" VerticalAlignment="Top" /> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button> 
</Grid> 
+1

這不起作用。 – AnjumSKhan 2015-01-15 17:06:29