2016-07-06 3 views
4
Custom_View.xaml 

    <UserControl> 
     <local:Custom_Text_Field 
      Custom_Text_Field_Color="{x:Bind ViewModel.Color1 , Mode=TwoWay}"> 
     </local:Custom_Text_Field> 
     <local:Custom_Text_Field 
      Custom_Text_Field_Color="{x:Bind ViewModel.Color2 , Mode=TwoWay}"> 
     </local:Custom_Text_Field> 
     <Button Click="{x:Bind ViewModel.ChangeColor"/> 
    </UserControl> 

Custom_View.cs 

    public sealed partial class Custom_View : UserControl 
    { 
     public Custom_View_VM ViewModel { get; set; } 
     public Custom_View() 
     { 
      ViewModel = new Custom_View_VM(); 
      this.InitializeComponent(); 
     } 
    } 

Custom_View_VM.cs 

    public class Custom_View_VM : NotificationBase 
    { 
     public Brush Color1 { get; set; } 
     public Brush Color2 { get; set; } 
     public void ChangeColor{//change color1 or color2}; 
    } 

verwenden ich die NotificationBase Klasse aus diesem Beispiel: https://blogs.msdn.microsoft.com/johnshews_blog/2015/09/09/a-minimal-mvvm-uwp-app/Datenbindung Ausgabe mit NotificationBase

Wenn ich Werte für Color1 oder Farbe2 im constructeur beeinflussen, es funktioniert (die Ansicht ändern), aber nach einem Aufruf ChangeColor, Werte im View-Modell werden geändert, haben sich jedoch nicht auf die Ansicht ausgewirkt.

+0

Normalerweise würden Sie DependencyProperties in Code-Behind anstelle von ViewModel erstellen. Der Consumer Ihres Steuerelements kann die Abhängigkeitseigenschaften Ihres Steuerelements an sein ViewModel binden. – markmnl

+0

Danke für Ihre Antwort, ich habe DependencyProperties im Code Custom_Text_Field erstellt, ich habe ein ViewModel für meine Custom_View erstellt, weil die Benutzeroberfläche komplizierter ist als mein Beispiel und er mit Daten von einem Webdienst verknüpft ist: ( – sasukaru

+0

) Es gibt 2 verschiedene Arten von Bindung hier: Bindung an den Code hinter (mit Dependancy-Eigenschaft) und Bindung an das ViewModel (mit INotifyPropertyChanged) - es ist nicht klar, was nicht funktioniert: der Rand (mit der DP) oder die Textfelder (gebunden an die VM)? –

Antwort

3

Damit die Benutzeroberfläche aktualisiert wird, sollte sie ein Ereignis PropertyChanged erhalten. Sie sollten NotificationBase-Mechanismus festlegen Eigenschaften verwenden, die auch die PropertyChanged Veranstaltung erhöhen:

public class Custom_View_VM : NotificationBase 
{ 
    private Brush color1; 
    public Brush Color1 
    { 
     get { return color1; } 
     set { SetProperty(color1, value,() => color1 = value); } 
    } 
    // TODO: same here 
    public Brush Color2 { get; set; } 
    public void ChangeColor{//change color1 or color2}; 
} 

auch nicht Farben gehen in ViewModelsin der Regel. Die ViewModel sollte einige Business-Logik-Eigenschaft, die Sie die Farbe der TextBox von XAML, wie IsNameAvailable basieren können.

+0

danke, aber hol {return This.Color1; } Werfen Sie ein System.StackOverflowException :(Ich vermisse wirklich etwas>< – sasukaru

+1

Behoben mein Beispiel, nicht 'This' Feld von' NotificationBase', es ist zu verwirrend. Sie können es in Model oder etwas umbenennen. –

+0

Danke, es funktioniert ! Jetzt werde ich dir folgen und meinen Code umgestalten :) – sasukaru

1

Sie müssen die Eigenschaft registrieren.

public static readonly DependencyProperty Custom_Text_Field_Color_Property = 
     DependencyProperty.Register("Custom_Text_Field_Color", typeof(Brush), 
     typeof(Class_Name), new UIPropertyMetadata(null)); 

     public Brush Custom_Text_Field_Color 
     { 
      get { return (Brush)GetValue(Custom_Text_Field_Color_Property); } 
      set { SetValue(Custom_Text_Field_Color_Property, value); } 
     } 

verwenden den Namen des Steuerelements (das heißt Klassenname) für typeof(Class_Name).

+1

Danke für Ihre Antwort, aber ich habe bereits meine Eigenschaft in Custom_Text_Field Code hinter registriert :) – sasukaru

-1

In Ihrer Fallklasse ist NotificationBase eine benutzerdefinierte Klasse, die Sie verwenden können oder nicht.

Ich erkläre nur das MVVM Entwurfsmuster grundsätzlich. In ViewModel sollte das Interface Interface INotifyPropertyChanged implementiert werden, und bei der Eigenschaft set das Ereignis PropertyChanged ausgelöst werden.

public sealed class MainPageViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _productName; 
    public string ProductName 
    { 
     get { return _productName; } 
     set 
     { 
      _productName = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ProductName))); 
      } 
     } 
    } 
} 

Unter Beispiel wird dieses MVVM Entwurfsmuster vorgeführt. https://code.msdn.microsoft.com/How-to-achieve-MVVM-design-2bb5a580