2011-01-07 53 views
1

我是一個經驗豐富的程序員,但對WPF來說是新手。我已經將表單上的textblock綁定到對象屬性,但它不會像我期望的那樣更新表單來設置屬性。綁定似乎是正確完成的 - 如果我使用更新屬性的按鈕進行故障診斷,表單會更改,但是當我最初通過解析本地XML文件在表單的構造函數中設置屬性時,它不會更新。C#WPF綁定行爲

我正在使用C#和VS2010。有人可以引導我做幾個步驟,或者將我引薦給一本書或編碼工具,讓我在這個駝峯。另外,請注意,我選擇通過模仿windowsclient.net中「我如何:構建我的第一個WPF應用程序」中使用的範例來構建事物的方式。如果您認爲我錯誤地回答了這個問題,那麼我會很樂意提供一個更好的教程。

形式XAML:

<Window ... 
    xmlns:vm="clr-namespace:MyProjectWPF.ViewModels"> 
    <Grid> 
    <Grid.DataContext> 
     <vm:MyConfigurationViewModel /> 
    </Grid.DataContext> 

    <TextBlock Name="textBlock4" Text="{Binding Path=Database}" /> 
    </Grid> 

MyConfigurationViewModel類定義:

class MyConfigurationViewModel : INotifyPropertyChanged 
{ 
    private string _Database; 

    public string Database 
    { 
    get { return _Database; } 
    set { _Database = value; OnPropertyChanged("Database"); } 
    } 

    public void LoadConfiguration() 
    { 
    XmlDocument myConfiguration = new XmlDocument(); 
    myConfiguration.Load("myfile.xml"); 
    XmlNode root = myConfiguration.DocumentElement; 

    Database = root["Database"].InnerText; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string Property) 
    { 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(Property)); 
    } 

而且代碼隱藏我的XAML形式:

public partial class MyForm : Window 
{ 
    private ViewModels.myConfigurationViewModel mcvm 
    = new ViewModels.myConfigurationViewModel(); 

    public MyForm() 
    { 
    mcvm.LoadConfiguration(); 
    } 

回答

5

你有myConfigurationViewModel的兩個實例。一個是在XAML中創建的,第二個是在表單的代碼隱藏內部創建的。你在後面的代碼中調用LoadConfiguration,它永遠不會被設置爲表單的DataContext。從XAML

刪除此:

<Grid.DataContext>  
    <vm:MyConfigurationViewModel /> 
</Grid.DataContext> 

,改變構造這樣:

public MyForm() 
{ 
    mcvm.LoadConfiguration();  
    DataContext = mcvm; 
} 
+0

謝謝。代碼修復工作完美,頂部的解釋是我需要了解爲什麼這些更改沒有推到我的表單。 – LikeMaBell 2011-01-07 20:53:10

0

你可以試試這個XAML:

<Window ... 
xmlns:vm="clr-namespace:MyProjectWPF.ViewModels"> 
<Grid> 

    <TextBlock Name="textBlock4" Text="{Binding Path=Database}" /> 
</Grid> 

與此代碼:

public partial class MyForm : Window 
{ 
    private ViewModels.myConfigurationViewModel mcvm = new ViewModels.myConfigurationViewModel(); 

    public MyForm() 
    { 
    mcvm.LoadConfiguration(); 
    this.DataContext = mcvm; 
    } 

[更新]解釋錯了,將其刪除。

+0

它*被*綁定到一個真實的實例...它只是不同於在代碼隱藏中使用的實例 – 2011-01-07 19:18:03