나는 모델이 , 패턴에 따라 ViewModel에서 모델의 속성을 업데이트 하시겠습니까?업데이트 모델 예를 들어
- 전체 모델을 업데이트 하시겠습니까?
- 이벤트 추가의 특정 속성을 업데이트 하시겠습니까?
- 의존성 주입?
나는 모델이 , 패턴에 따라 ViewModel에서 모델의 속성을 업데이트 하시겠습니까?업데이트 모델 예를 들어
이것은 진정한 대답이 아닙니다.
먼저 당신의 창,
<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>
둘째,
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));
}
}
셋째 모델의 사용
을 : 모든 것을 의존하는 방법이 하나의 단지에 대한 관계를 표시해야합니다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; }
}
일부 참고 :
MainViewModel
을하지, 그래서 난 그냥 당신이 볼 때, DataTemplates
이 바인딩 코드 숨김DataContext
의 시작하기에 충분하다.PropertyChanged
을 구현 didnt는설명해 주셔서 감사합니다. "하지만 그건 사실이야. 무슨 일이 벌어지고 있는지 진정으로 이해하고있어." - OnPropertyChanged 동안 무슨 일이 일어나는지) 나는 이것이 Fody를 사용하는 유일한 이유입니다. – streamdown
전에 쓴대로 : 게으름 때문에. – streamdown
이렇게 크게 단순화 된 예입니다. ViewModel에서 속성을 합성 할 수 있습니다. 속성은 null을 허용 할 수 있습니다. Repository 등에서 속성을 얻을 수 있습니다. – streamdown
이 Entierly는 DataContext를 설정하는 방법과 응용 프로그램에서 수행해야하는 작업에 따라 다릅니다. 그러나 일반적으로 모델 내부의 Properties가 바인딩되어 있으므로이를 업데이트해야합니다. – lokusking
실제 프로젝트를 수행하는 경우 모델을 ViewModel 생성자에 전달합니다. 그러나 나는 다시 만들 수있다)) 나는 그 패턴에 따라 관할 방향이 필요하다. 모델을 XAML의 뷰에 직접 바인딩하여 업데이트 할 수 있다고 생각합니다. – streamdown