2017-03-28 18 views
0

低レベルのWPFをお試しください。私のプロジェクトで問題が発生しました。私は、彼がタブをクリックするとユーザーに表示されるusercontrolの形式を持っています。また、名前のタブの値を抽象クラスのプロパティに保存します。私は、名前のタブの関連するプロパティでformularを埋めたいと思っています。クラスのプロパティからテキストブロックのテキスト値を変更する方法

これを行うには、私のテキストブロックのテキストのプロパティでバインディングメソッドを使用する必要があることを知っています。私はそれを実装するために多くの方法を試しましたが、それらはすべて失敗しました。

は、いくつかのコードをお見せしましょう、私のXAMLがあります:

<TextBlock Name="nomEcole" Text="{Binding NomEcole, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" Style="{StaticResource Heading2}" Margin="10,10,0,0" /> 

ユーザーコントロールがあります:(_nomEcoleVisualiseeの値がメソッドによって更新され

public partial class EcoleControl : UserControl, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void FirePropertyChanged(string name) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    private string _nomEcole; 
    public string NomEcole 
    { 
     get { return MainWindow._RE.EcoleVisualisee.Nom; } 
     set 
     { 
      if (MainWindow._RE.EcoleVisualisee.Nom != value) 
      { 
       MainWindow._RE.EcoleVisualisee.Nom = value; 
       this.FirePropertyChanged("NomEcole"); 
      } 
     } 
    } 

    public EcoleControl() 
    { 
     this.DataContext = this; 
     InitializeComponent(); 
    } 
} 

は、そして、私の抽象クラスがあります):

class RelationEcoles 
{ 
    private string _nomEcoleVisualisee; 
    public string NomEcoleVisualisee 
    { 
     get { return _nomEcoleVisualisee; } 
     set { this._nomEcoleVisualisee = value; } 
    } 
} 

ありがとうございました!また、私のプロジェクトがMVVMのように見えるかどうかは分かりません。

+0

本当にmvvmでは、あなたは反転しています:ユーザコントロールはINotifyPropertyChangedを実装してはならないが、RelationEcolesを実装してはいけません。あなたが間違った方法をとっているので、既存のコードを見てください。 – GCamel

+0

あなたはどこにバインドするNomEcoleプロパティを設定していますか? – mm8

+0

@ mm8 RelationEcolesクラスのメソッドで設定します。最近のタブリンクをクリックすると、プロパティの値を変更するメソッドが適用されます。 –

答えて

0

あなたのプロパティがusercontrolの.csファイルにあるため、このようなバインディングは機能しません。

通常あなたがINPCを実装し、このような性質を保持するEcoleViewModel必要があります:

public class EcoleViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void FirePropertyChanged(string name) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    private string _nomEcole; 
    public string NomEcole 
    { 
     get { return MainWindow._RE.EcoleVisualisee.Nom; } 
     set 
     { 
      if (MainWindow._RE.EcoleVisualisee.Nom != value) 
      { 
       MainWindow._RE.EcoleVisualisee.Nom = value; 
       this.FirePropertyChanged("NomEcole"); 
      } 
     } 
    } 
} 

を次に、あなたがこのようなユーザーコントロールのctorのにDataContextを設定することができます。

public EcoleControl() 
    { 
     this.DataContext = new EcoleViewModel(); 
     InitializeComponent(); 
    } 

今バインディングが機能するはずです。

+0

OPは、DataContextを、NomEcoleプロパティを含むEcoleControlの現在のインスタンスに設定します。基本的にはあなたがしたことと同じです。 xaml.csファイル内にあることはバインディングには関係ありません。バインディングはDataContext内を調べています。 ViewModelのための別のクラスを持つことは必須ではなく、私はそれが問題を解決することに疑いがあります。 – 3615

+0

@ 3615 OPはまた、彼がMVVMパターンに違反しているかどうか尋ねていました。しかし、あなたが正しいです、ソリューションは、ビューモデルにプロパティを移動し、代わりにそのインスタンスにバインドします。それにもかかわらず、このバインディングはうまくいきません。そうでなければ、 'string'型のプライベートフィールドを保持し、' Nom'プロパティの代わりに 'MainViewModel'のどこかで使用してください。 – user3292642

+0

ありがとうございます。私はあなたのソリューションを試しましたが、それでも動作しませんでした。それはプロパティの名前が変更されたときに更新されていないようです。 –

関連する問題