2016-06-25 23 views
0

SensorModelという名前のviewModelクラスにdataContextをバインドするSensorControlという名前のuserControlがあります。 結合が成功し、初期値のViewModelのは、ユーザーコントロールに表示されますが、問題は、私はのViewModelのプロパティを変更とき、ユーザーコントロールはを更新しないということである、と私は手動で(でそれを更新する必要がありますそのdataContextにnullを割り当て、viewModelを再度割り当てます)。 ここに私のコードの簡単な例があります。viewModelの変更でビューが更新されない

SensorControl.xml:

<UserControl ...[other attributes]... DataContext={Binding Model}> 
. 
. 
. 
<Label Content="{Binding Title}"/> 
. 
. 
. 
</UserControl> 

SensorControl.xml.cs(コードビハインド):

public partial class SensorControl : UserControl 
{ 
    public SensorModel model; 

    public SensorModel Model 
    { 
     get { return model; } 
     set { model = value; } 
    } 
    public SensorControl(SensorModel sm) 
    { 
     Model = sm; 
    } 
} 

MainWindow.xml.cs:

public partial class MainWindow : Window 
{ 
    public SensorModel sensorModel_1; 
    public SensorControl sensorControl_1; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     sensorModel_1 = new SensorModel(...[some arguments]...); 
     sensorControl_1 = new SensorControl(sensorModel_1); 
     mainGrid.Children.Add(sensorControl_1); 
    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     sensorModel_1.Title = "myTitle"; 
     //The UserControl does not update 
    } 

0)Iを実装INotifyPropertyChanged in SensorModel

1)私が必要とする理由は、私のプロジェクト(それは実際の電子センサーです)に「センサー」という概念が1つしかないので、私はそのための単一のモデルを持っていますデータベースなど)、UIにはSensorのさまざまな側面を提示するための複数のuserControlがあります。だから私は実際のセンサーごとに1つのモデル(SensorModel)のインスタンスを作成しなければならず、複数のuserControlsがそれにバインドする必要があります(それぞれがモデルの異なる部分を使用します)。

2)私はWPFの新機能ではありませんが、私はMVVMにはまったく新しいものです。何か本質的なことを誤解している可能性があるので、誰かが正しい方法を明確に説明できたらうれしいです。ユーザーコントロールには、事前

+0

'ViewModel'は' UserControl'の一部であってはなりません。 – AnjumSKhan

答えて

0

おかげで、私はあなたのアドバイスを取り、最終的に私は方法を見つけました。

1)Iは、タイプ(特性変化(名ModelChanged

2)のいずれかが、その後の両方が提案Merve & manOvisionとして、IがSensorControlに依存プロパティを宣言するたびに発射SensorModelのイベントを実装しましたその(Binding Path=Model.Title

3)へSensorModel)と結合するUI要素は、それからSensorControlこの依存関係プロパティのModelChangedイベントを使用し、()タイプINotifyPropertyChangedののイベントを発生させるので、バインディングは、それらの値を更新

正常に動作します。

0

おかげで、DataContextの属性を削除し、追加x:Name属性を。次に、あなたのラベルには、次のようにバインドします

<UserControl x:Name="uc"> 
    <Label Content="{Binding ElementName=uc,Path=Model.Title}" /> 
</UserControl> 

私は、問題は、それが子として追加されるとき、親のDataContextのオフ結合作品がmainGridに基づいてされるためのDataContextがモデルに設定することができないと信じてそれに。プロパティ "Model"はmaiGridのDataContextに存在しないので、バインディングは発生しませんので、更新は反映されません。 UserControlのDataContextを正しく取得するのは難しいことがあります。 ElementNameをかなり使用するか、UserControlでDependencyPropertiesを作成し、コントロールを使用する親からそれらを設定します。

0

ビュー内でViewModelクラスにDataContextを設定する必要があります。また、MVVMパターンを適用する場合は、アクションにICommandを使用する必要があります。 MainWindowクラスの代わりに、ロジックをバックグラウンドで実行するMainViewクラスを実装する方がいいでしょう。

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new MainView(); 
    // sensorModel_1 = new SensorModel(...[some arguments]...); 
    // sensorControl_1 = new SensorControl(sensorModel_1); 
    // mainGrid.Children.Add(sensorControl_1); 
} 

あなたのMAINVIEWクラス:

public class MainView { 
    public SensorControl Control {get; internal set;} 
    ... 

} 

そして、あなたのXAMLでバインディングを変更します。皆さんのすべてに

<Label Content="{Binding Control.Model.Title}"/> 
関連する問題