2016-07-18 3 views
0

나는 모델이 , 패턴에 따라 ViewModel에서 모델의 속성을 업데이트 하시겠습니까?업데이트 모델 예를 들어

  • 전체 모델을 업데이트 하시겠습니까?
  • 이벤트 추가의 특정 속성을 업데이트 하시겠습니까?
  • 의존성 주입?
+0

이렇게 크게 단순화 된 예입니다. ViewModel에서 속성을 합성 할 수 있습니다. 속성은 null을 허용 할 수 있습니다. Repository 등에서 속성을 얻을 수 있습니다. – streamdown

+0

이 Entierly는 DataContext를 설정하는 방법과 응용 프로그램에서 수행해야하는 작업에 따라 다릅니다. 그러나 일반적으로 모델 내부의 Properties가 바인딩되어 있으므로이를 업데이트해야합니다. – lokusking

+0

실제 프로젝트를 수행하는 경우 모델을 ViewModel 생성자에 전달합니다. 그러나 나는 다시 만들 수있다)) 나는 그 패턴에 따라 관할 방향이 필요하다. 모델을 XAML의 뷰에 직접 바인딩하여 업데이트 할 수 있다고 생각합니다. – streamdown

답변

1

이것은 진정한 대답이 아닙니다.

먼저 당신의 창,

<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; } 
    } 

일부 참고 :

  1. 나는 때문에 lazyness의 더 MainViewModel을하지, 그래서 난 그냥 당신이 볼 때, DataTemplates이 바인딩 코드 숨김
  2. , 순수한 GUI - 바인딩, 모델 노는 및 사용을 사용 DataContext의 시작하기에 충분하다.
  3. 모든 것이 어떻게 작동하는지 익히고 이해하고 싶다면 써드 파티 용품을 사용하지 말 것을 권한다. 나는 모든 것을 반복해서 타이핑하지 않고 이렇게 편안함을 안다. 하지만 그건 사실입니다, 당신은 진실로 무슨 일이 일어나고 있는지 이해합니다. 또한이 중단 점을 설정하고이 Fody-꼬추를 사용 해달라고하면 나는 또한 때문에 lazyness
  4. 의, 어디서나 PropertyChanged을 구현 didnt는
  5. 에 세드릭에 깊은 좀 걸릴 수 있습니다, 생성자-주사
  6. 에 대한 필요가 없습니다
+0

설명해 주셔서 감사합니다. "하지만 그건 사실이야. 무슨 일이 벌어지고 있는지 진정으로 이해하고있어." - OnPropertyChanged 동안 무슨 일이 일어나는지) 나는 이것이 Fody를 사용하는 유일한 이유입니다. – streamdown

+0

전에 쓴대로 : 게으름 때문에. – streamdown