2017-01-25 2 views
1

명령이있는 viewmodel이 있습니다. 그러나 마지막으로 추가 한 항목 만 명령으로 편집 할 수 있습니다. 그것은 당신이 송시를 볼 때 의미가 있습니다. 그러나 그것은 내가 원하는 것이 아닙니다. 선택한 항목을 편집하고 싶습니다. 나는 모델이MVVM 명령은 마지막으로 추가 된 항목을 선택합니다.

라는 파트 내가 불을 시도 할 때마다 PartViewModel 이제

/// <summary> 
    /// Returns a ViewModel containing all parts. 
    /// </summary> 
    /// <param name="dt">Database to use.</param> 
    public PartViewModel(DatabaseType dt) 
    { 
     GenerateViewModelForAllParts(dt); 
    } 
    private async void GenerateViewModelForAllParts(DatabaseType dt) 
    { 
     using (NexusWCFServiceClient client = new NexusWCFServiceClient()) 
      foreach (Part item in await client.GetAllPartsAsync(dt)) 
      { 
       _part = item; 
       _items.Add(item); 
      } 
    } 
    #endregion 

    #region Members 
    private ObservableCollection<Part> _items = new ObservableCollection<Part>(); 

    private Part _part; 
    int count = 0; 
    #endregion 

    #region Properties 
    public ObservableCollection<Part> Items 
    { 
     get { return _items; } 
     set { _items = value; } 
    } 

    public Part Part 
    { 
     get { return _part; } 
     set { _part = value; } 
    } 

    public string PartCode 
    { 
     get { return Part.PartCode; } 
     set 
     { 
      if (Part.PartCode != value) /* Check if value is changed */ 
      { 
       Part.PartCode = value; 
       RaisePropertyChanged("PartCode"); /* Raise event */ 
      } 
     } 
    } 

    public string Description 
    { 
     get { return Part.Description; } 
     set 
     { 
      if (Part.Description != value) 
      { 
       Part.Description = value; 
       RaisePropertyChanged("Description"); 
      } 
     } 
    } 

    #region Commands 
    private void UpdateDescriptionExecute() 
    { 
     //count++; 
     //Description = Description + count.ToString(); 
     // Part.Description = "asdasdasd"; 
     MessageBox.Show(PartCode); 
    } 

    private bool CanUpdateDescriptionExecute() 
    { 
     if (count >= 2) 
      return false; 
     else 
      return true; 
    } 

    public ICommand UpdateDescription 
    { 
     get 
     { 
      return new RelayCommand(UpdateDescriptionExecute, CanUpdateDescriptionExecute); 
     } 
    } 
    #endregion 
} 

라는 명령과 함께

public class Part 
{ 
    private string _partcode; 
    private string _description; 

    public string PartCode 
    { 
     get { return _partcode.Trim(); } 
     set { _partcode = value; } 
    } 

    public string Description 
    { 
     get { return _description; } 
     set { _description = value; } 
    } 
    } 

뷰 모델 : 나는 내 문제를 스케치합니다 보기의 명령 :

<Window x:Class="NexusWPF.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="700" Width="525" x:Name="TestView"> 
    <Grid> 
     <StackPanel x:Name="stck"> 
      <ListView x:Name="lb" ItemsSource="{Binding Items}"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Vertical" x:Name="stck"> 
          <TextBlock Text="{Binding Path=PartCode}"/> 
          <TextBlock Text="{Binding Path=Description}"/> 
          <Button Content="Update" DataContext="{Binding ElementName=TestView, Path=DataContext}" Command="{Binding UpdateDescription}" CommandParameter="{Binding}"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </StackPanel> 
    </Grid> 
</Window> 

마지막으로 추가 된 항목 (부분)이 편집됩니다. ViewModel의 다음 코드 때문에 의미가 있습니다.

_part = item; 

어떻게 명령을 선택한 항목에 바인딩합니까? 나는 바인딩에있는 것이 아니라 viewmodel에 잘못된 것이 있어야한다고 생각합니다. 새로운 파트가 추가 될 때마다 _part get을 덮어 씁니다. 하지만 내가 어떻게 바꿀 수 있을까요?

답변

1

사용하십시오 Part 명령 매개 변수를 받아들이는 RelayCommand<Part>는 :

public ICommand UpdateDescription 
{ 
    get 
    { 
     return new RelayCommand<Part>(UpdateDescriptionExecute, CanUpdateDescriptionExecute); 
    } 
} 

private void UpdateDescriptionExecute(Part part) 
{ 
    MessageBox.Show(part.PartCode); 
} 

private bool CanUpdateDescriptionExecute(Part part) 
{ 
    if (count >= 2) 
     return false; 
    else 
     return true; 
} 

그리고 수정이 명령은 약간 바인딩 :

<Button Content="Update" Command="{Binding DataContext.UpdateDescription,ElementName=TestView}" CommandParameter="{Binding}"/> 
+0

당신이 어디로 가는지 내가 얻을 수 있지만 지금은 NullReferenceException이 얻을. UpdateDescriptionExecure의 'part'매개 변수가 null이므로 선택한 부분을 전달하지 않습니다. 어떤 아이디어? – Marcel

+1

XAML 태그의

+0

고마워요! 그것을 간과했다. 아직 한 가지 더 질문이 있지만 그 주제에 대해 새로운 주제를 만들 것입니다. – Marcel

관련 문제