2017-01-25 1 views
1

У меня есть модель с командой. Но только последний добавленный элемент редактируется командой. Это имеет смысл, когда вы смотрите на оду. Но это не то, что я хочу. Я хочу, чтобы выбранный элемент редактировался. Я эскиз моей проблемы:Команда MVVM выбирает последний добавленный элемент

У меня есть модель, названная Части

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

ViewModel с командованием, названного 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 
} 

Теперь всякий раз, когда я пытаюсь стрелять команда на поле зрения:

<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

Используйте RelayCommand<Part>, который принимает параметр в 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. Параметр «part» в UpdateDescriptionExecure имеет значение null, поскольку он не передает выбранную часть. Есть идеи? – Marcel

+1

Вы удалили атрибут DataContext из элемента

+0

Спасибо! Оказалось, что это одно. Еще есть еще один вопрос, но он будет создавать новую тему для этого. – Marcel