2012-09-27 50 views
0

我剛剛開始使用WPF,並一直在閱讀「Sams教你自己WPF」。在第6章中,它介紹瞭如何在後面的代碼中綁定屬性。這種方法對我來說取得了不一致的成功。Sams在24小時內自學WPF:與OnChanged事件的結果不一致

在我當前的項目中,這個方法適用於兩個值,我綁定到標籤的雙打。當我嘗試使用相同的方法將bool綁定到MenuItem的IsEnabled屬性時,該方法失敗。

然後我回到本書的簡單示例,並將屬性類型從String更改爲bool。在這種情況下,我可以將bool綁定到Button和TextBox。

我注意到這個方法失敗時,EventHandler在OnChanged函數中總是爲null。我錯過了什麼?

private String _myString; 
public String MyString 
{ 
    get { return _myString; } 
    set 
    { 
      _myString = value; 
      OnMyStringChanged(); 
    } 
} 

public event EventHandler MyStringChanged; 

private void OnMyStringChanged() 
{ 
    if (MyStringChanged != null) 
      MyStringChanged(this, EventArgs.Empty); 
} 

我在我的MainWindow類中有以下XAML。在MainWindow的構造函數中,我將DataContext設置爲包含MyString的類的新實例。

<TextBox Text="{Binding Path=MyString, Mode=TwoWay}" 
     Margin="4"/> 
<Button Grid.Row="1" 
     Height="40" 
     Margin="4" 
     Click="Button_Click" 
     Content="{Binding Path=MyString, Mode=TwoWay}"/> 
+0

我們還需要查看您的xaml。 – mydogisbox

回答

1

你面臨的問題是,實例化你的表格的副本的代碼需要一個聽衆註冊到「MyStringChanged」事件。

檢查要聲明的形式的實例: 即

var myForm = new TestForm(); 
TestForm.Show(); 

你需要添加:

var myForm = new TestForm(); 
myForm.MyStringChanged += someHandlingMethod; 
TestForm.Show(); 

類似的東西應該在樣品中被提及。老實說,雖然這不是我讀過的很棒的樣本。他們正在使用WPF製作WinForm風格的應用程序。要學習WPF,你需要看MVVM。這當然不是24小時的任務。完成上述操作你可能會創建一個WinForm應用程序,它會爲你節省很多麻煩。

0

問題出在我身上。我拼錯了XAML綁定路徑中的變量名稱。如果綁定路徑無效,我期望收到編譯器警告或異常。即使將綁定模式更改爲「雙向」,也不會產生任何帶有不存在的綁定路徑的警告或運行時異常。對不起,浪費你的時間。

+1

這是WPF綁定中比較煩人的「特徵」之一。每當出現意外的缺失行爲時,請在運行時檢查輸出窗口。經過幾次「grrr !!!」有約束力的時刻成爲第二天性。 :) –