2010-11-17 131 views
0

我在這裏丟失了什麼簡單的東西?爲什麼我的副本不顯示在屏幕上?愚蠢的WPF數據綁定問題

<Window x:Class="DeleteThis.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" > 
<Grid> 

    <StackPanel> 

     <TextBlock Text="{Binding Path=SomeCopy}" Height="35" Width="100" Margin="10"/> 


    </StackPanel> 
</Grid> 

和我的代碼隱藏。

public partial class MainWindow : Window 
{ 


    private string _someCopy; 
    public string SomeCopy 
    { 
     get 
     { 
      return _someCopy; 
     } 

     set 
     { 
      _someCopy = value; 
     } 
    } 

    public MainWindow() 
    { 

     InitializeComponent(); 

     SomeCopy = "why doesn't this display"; 
    } 
} 
+0

下面的答案都是正確的。你應該真的擺脫DP並改用ViewModel。將虛擬機的實例傳遞給View的構造函數,並將數據上下文分配給虛擬機。你可以看到我在這裏怎麼做 http://stackoverflow.com/questions/4199162/ok-cancel-dialog-mvvm-pattern-wpf-how-can-i-do-it/4201604#4201604 – ihatemash 2010-11-17 04:59:51

回答

1

WPF永遠不會發現該屬性已更改。

要修復它,您可以將該屬性變成dependency property

編輯:您還需要結合於Window本身的屬性,像這樣

<TextBlock Text="{Binding Path=SomeCopy, RelativeSource={RelativeSource Self}}" ... /> 
+0

@engwar :爲了看到這個動作,在'InitializeComponent()'前面的'SomeCopy ='行。現在SomeCopy在創建TextBlock之前會有一個值,它會從綁定中獲得一些值。 – Tergiver 2010-11-17 04:50:22

+0

-1這不是當前的問題,DataContext從不設置,它是空的。 – 2010-11-17 04:57:23

+0

@Aaron:這是_a_問題。但是,你是對的;我錯過了。固定。 – SLaks 2010-11-17 05:01:09

0

SLaks的答案是正確的。但是手動創建依賴項屬性很煩人,所以我將您鏈接到我最喜歡的解決方案:A custom PostSharp NotifyPropertyChangedAttribute,與PostSharp一起使用時,將任何給定類的所有屬性都變爲依賴項屬性。

+0

正常'NotifyPropertyChanged'調用在DependencyObjects上不起作用。 – SLaks 2010-11-17 05:03:58

+0

@SLaks,你能擴展你的意思嗎?我不明白這句話的大部分內容,例如關於'NotifyPropertyChanged'調用什麼是「正常」;什麼依賴對象與依賴項屬性或與OP有關或與我發佈的內容有關,或者爲什麼您的文章中的兩個名詞不能一起工作。 – Domenic 2010-11-17 06:22:20

+0

我不認爲你可以爲DependencyObjects(例如'Window'類)中的非依賴屬性引發NotifyPropertyChanged事件。換句話說,PostSharp在這裏沒有幫助。 – SLaks 2010-11-17 12:17:08

3

您從未設置窗口的DataContext。你的XAML更改爲這個...

<TextBlock Text="{Binding}" Height="35" Width="100" Margin="10"/> 

...並改變你的代碼後面加DataContext線...

public MainWindow() 
    { 
     InitializeComponent(); 

     SomeCopy = "why doesn't this display"; 

     this.DataContext = SomeCopy; 
    } 

您當前的問題無關,與需要一個DependencyProperty爲在其他答案中提到。

+0

他仍然需要更改通知。 – SLaks 2010-11-17 05:01:29

+0

@SLaks在這種情況下不需要更改通知。添加上面的所有內容,該值將顯示爲OP請求,而不實施INotifyPropertyChanged或將其設置爲DP。如果OP想要走得更遠,那麼現在的問題......然後是所有的投注都關閉了。 – 2010-11-17 05:05:08