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:
- ich machte keine
MainViewModel
wegen lazyness, so dass ich nur verwendet Codebehind
- Wie Sie sehen, gibt es zwangsläufig
DataTemplates
, reine GUI-Bindungen, Modell-Manipulations und die Nutzung der DataContext
. Genug für einen Jumpstart
- 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
- werde ich nicht überall die
PropertyChanged
implementieren, auch wegen lazyness
- Wenn Sie nicht dieses Fody-Dingen, gibt es keine Notwendigkeit für Constructor-Injections
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
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
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