2017-01-25 14 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; } 
    } 
    } 

私は火にしようとするたびに今

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

PartViewModelという名前のコマンドを使用したAのViewModelを、持っています表示内のコマンド:

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

最後に追加された項目(Part)が編集されます。 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

ありがとう!それを見落とした。それでももう1つの質問がありますが、そのトピックについて新しいトピックを作成します。 – Marcel

関連する問題