2011-01-07 8 views
1

私は合理的に経験豊富なプログラマーですが、WPFには初めてです。フォーム上のテキストブロックをオブジェクトプロパティにバインドしましたが、プロパティを設定するときに期待していたとおりにフォームを更新していません。バインディングは正しく行われているように見えます。プロパティを更新するボタンでトラブルシューティングを行うと、フォームは変わりますが、ローカルのXMLファイルを解析してフォームのコンストラクタでプロパティを最初に設定すると、更新されません。C#WPFバインディングの振る舞い

私はC#とVS2010を使用しています。誰かが私にいくつかのステップを案内したり、私をこのやりとりの上に置く書籍やコーディングツールを紹介してくれますか?また、私はwindowsclient.netの "How Do I:Build My First WPF Application"のパラダイムを模倣して物事を構造化することにしました。私が間違っていると思うなら、私はより良いチュートリアルへのポインタに感謝します。あなたがmyConfigurationViewModelの2つのインスタンスを持っている

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

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

答えて

5

フォーム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形式。 1つはXAML内で作成され、2つ目はフォームのコードビハインド内に作成されます。フォームのDataContextとして決して設定されていない、コードの背後にあるLoadConfigurationを呼び出しています。

XAMLからこれを削除します。

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

をし、これにコンストラクタを変更します。

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

ありがとうございました。コード修正は完全に機能しました。先頭の説明は、なぜ変更が私のフォームに反映されていないのかを確認する必要がありました。 – LikeMaBell

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

* *は実際のインスタンスにバインドされています...コードビハインドで使用されているものと同じインスタンスではありません –