2016-07-18 3 views
0

Zum Beispiel habe ich ein Modell:Aktualisierung des Modells aus den Ansichtsmodell Eigenschaften mit der Erhaltung MVVM Muster

public class PropertiesModel 
{ 
    public bool MaterialEnable { get; set; } 
} 

Ansichtsmodell:

public class ViewModel: INotifyPropertyChanged 
{ 
     private PropertiesModel _model; 
     public bool Recalc { get; set; } 

     puplic ViewModel (PropertiesModel model) 
     { 
     _model = model; 
     Recalc = _model.MaterialEnabled; 
     } 
} 

Und finaly - XAML:

<ToggleSwitch IsChecked="{Binding Recalc}" /> 

Wie richtig Aktualisieren Sie die Eigenschaft im Modell gemäß dem Muster vom ViewModel?

  • das gesamte Modell aktualisieren?
  • die spezifischen Eigenschaften des Hinzufügens von Ereignissen aktualisieren?
  • Dependency Injection?
+0

Dieses stark vereinfachte Beispiel. Eigenschaften können im ViewModel zusammengesetzt sein. Eigenschaften können nullfähig sein. Eigenschaften können aus dem Repository usw. abgerufen werden. – streamdown

+0

Dies hängt ganz davon ab, wie Sie Ihren DataContext setzen und was Ihre Anwendung tun soll. Aber im Allgemeinen sind die Eigenschaften innerhalb des Modells gebunden und sollten daher aktualisiert werden. – lokusking

+0

Wenn ein reales Projekt erstellt wird, übergebe ich das Modell an den Konstruktor ViewModel. Aber ich kann remake)) Ich brauche nur eine kompetente Richtung nach dem Muster. Binden Sie das Modell direkt an die View in XAML, um es zu aktualisieren. Ich denke, es ist falsch. – streamdown

Antwort

1

Dies ist keine echte Antwort. Dies sollte man nur zeigen, die Beziehungen, wie alles abhängt:

Zuerst Ihre Fenster

<Window x:Class="MySample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:MySample" 
     xmlns:po="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
     mc:Ignorable="d"   
     Title="MainWindow" > 
    <Window.Resources> 
     <BooleanToVisibilityConverter x:Key="BoolToVis"/>  
    </Window.Resources> 

    <Grid Height="200"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <StackPanel> 
      <CheckBox Content="ShowListBox" x:Name="chk"></CheckBox> 
      <ListView ItemsSource="{Binding Ponys}" x:Name="lst" SelectedItem="{Binding SelectedPony}"> 
       <ListView.Visibility> 
        <Binding ElementName="chk" Path="IsChecked" Converter="{StaticResource BoolToVis}"/> 
       </ListView.Visibility> 
       <ListView.ItemTemplate> 
        <DataTemplate DataType="{x:Type local:Pony}"> 
         <WrapPanel Background="{Binding Color}" > 
          <TextBlock Text="{Binding Id}" Margin="0,0,5,0" Padding="2"/> 
          <TextBox Text="{Binding Name}"></TextBox> 
         </WrapPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
      <WrapPanel> 
       <TextBlock Text="New Description for selected Pony: "/> 
       <TextBox Width="100" Text="{Binding SelectedPony.Name, UpdateSourceTrigger=PropertyChanged}"></TextBox> 
      </WrapPanel> 
     </StackPanel> 
    </Grid> 
</Window> 

Zweitens ein Modell

public class Pony : INotifyPropertyChanged 
    { 
     public int Id { 
      get; set; 
     } 
     private string _name; 
     public string Name { 
      get { return this._name; } 
      set { this._name = value; 
       this.OnPropertyChanged("Name"); 
      } 
     } 

     public Brush Color { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Drittens den Nutzungs

public partial class MainWindow : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.Ponys = new List<Pony>(); 
      this.Ponys.Add(new Pony() { Id = 1, Name = "Fluffy", Color = Brushes.DeepPink }); 
      this.Ponys.Add(new Pony() { Id = 2, Name = "Not so fluffy", Color = Brushes.Chocolate }); 

      this.DataContext = this; 
     } 

     private Pony _pony; 
     public Pony SelectedPony { 
      get { return this._pony; } 
      set { 
       this._pony = value; 
       this.OnPropertyChanged("SelectedPony"); 
      } 
     } 

     public List<Pony> Ponys { get; set; } 
    } 
Einige

Hinweise:

  1. ich machte keine MainViewModel wegen lazyness, so dass ich nur verwendet Codebehind
  2. Wie Sie sehen, gibt es zwangsläufig DataTemplates, reine GUI-Bindungen, Modell-Manipulations und die Nutzung der DataContext. Genug für einen Jumpstart
  3. Ich empfehle Ihnen dringend, kein 3rd-Party-Stuff zu verwenden, wenn Sie lernen und verstehen wollen, wie alles funktioniert. Ich weiß das so angenehm, nicht alles immer und immer wieder zu tippen. Aber das ist der Weg, Sie verstehen wirklich, was passiert. Sie können auch Haltepunkte setzen und einen tiefen Blick auf nehmen, was auf
  4. werde ich nicht überall die PropertyChanged implementieren, auch wegen lazyness
  5. Wenn Sie nicht dieses Fody-Dingen, gibt es keine Notwendigkeit für Constructor-Injections
+0

Vielen Dank für die Klarstellung. "Aber das ist der Weg, du verstehst wirklich, was passiert." - Ich weiß, was passiert, während OnPropertyChanged)) Dies ist nur eine Sache, warum ich Fody benutze. – streamdown

+0

Wie du schon früher geschrieben hast: wegen Faulheit. – streamdown

Verwandte Themen