WPF MVVMプロジェクトでコンテキストメニューをバインドする -- c# フィールド と wpf フィールド と xaml フィールド と mvvm フィールド 関連 問題

Binding a context menu in a WPF MVVM project












-1
vote

問題

日本語

私のMVVM WPFプロジェクトで何が悪いのかを理解するのに苦労しています。カスタムContextMenuコマンドを作成しようとしています。私のメインウィンドウのHCC内のビューであるワークスペースがあります。 Workspace(ProductRecordView)には、ViewModel(ProductRecordViewModel)による観測可能なコレクションによって入力されたListViewが含まれています。データコンテキストはオプション8 、MainWindowResources xaml。そのため、次のようにPRVにContextMenuを作成しました。

<事前> <コード> <ListView.ContextMenu> <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> <MenuItem Header="Delete" Command="{Binding Path=DeleteRecord}"/> </ContextMenu> </ListView.ContextMenu>

そしてPRVMでは、以下のことがあります。

<事前> <コード> #region Presentation Properties public ICommand DeleteRecord { get { if (_deleteMe == null) { _deleteMe = new RelayCommand( param => this.Delete(), param => this.CanDelete ); } return _deleteMe; } } #endregion Presentation Properties #region Public Methods public void Delete() { MessageBox.Show("Test Execute");//this is just for testing the binding of Delete } #endregion Public Methods #region Private Helpers bool CanDelete = false; //this is just for testing the binding of CanDelete #endregion Private Helpers

アプリケーションを実行してリストビューの項目を右クリックすると、最初のスニペットで説明されているようにコンテキストメニューが表示されますが、バインドされた結果のどちらでも構いません。この場合、私はどうやって間違っているのでしょうか。

ProductRecordViewのDataContextは、MainWindowResourcesに次のように設定されています。

<事前> <コード> <DataTemplate DataType="{x:Type vm:ProductRecordViewModel}"> <vw:ProductRecordView /> </DataTemplate>

このDataContextがビュー内のボタンを作成し、データバインディングを割り当てようとしているかのように機能していることを知っています。バインディングは完全に機能し、ProductRecordViewModel

でコマンドを実行します。
英語

I am struggling to understand where I'm going wrong with my MVVM WPF project. I am trying to create a custom contextmenu command. I have a workspace, which is a view, within a HCC in my MainWindow. The workspace (ProductRecordView) contains a listview populated by an observable collection by the viewmodel (ProductRecordViewModel). The data context is set by Option 8, in the MainWindowResources XAML. So I have created the contextmenu in the PRV as follows:

<ListView.ContextMenu>   <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">     <MenuItem Header="Delete" Command="{Binding Path=DeleteRecord}"/>   </ContextMenu> </ListView.ContextMenu> 

and in the PRVM I have the following things:

#region Presentation Properties  public ICommand DeleteRecord {     get     {         if (_deleteMe == null)         {             _deleteMe = new RelayCommand(                 param => this.Delete(),                 param => this.CanDelete                 );         }          return _deleteMe;     } }  #endregion Presentation Properties  #region Public Methods  public void Delete() {     MessageBox.Show("Test Execute");//this is just for testing the binding of Delete }  #endregion Public Methods  #region Private Helpers  bool CanDelete = false; //this is just for testing the binding of CanDelete  #endregion Private Helpers 

When I run the application and right click on an item in the list view, I am presented with the context menu as described in the first snippet, however it is not binding as intended as neither of the bound outcomes occur. How do I properly bind in this case, what am I doing wrong?

The DataContext of ProductRecordView is set in MainWindowResources as follows:

  <DataTemplate DataType="{x:Type vm:ProductRecordViewModel}">   <vw:ProductRecordView /> </DataTemplate> 

I know that this DataContext is working as intended as if I try to create a button in the view and assign a data binding to it, the binding works perfectly and executes the command in the ProductRecordViewModel

</div
           
         
         

回答リスト

2
 
vote

より正確にエラーメッセージを見てみましょう。

BindingExpression Pathエラー: 'deletecord'プロパティが見つかりません 'Object' '' ListCollectionView '(HashCode = 12713695)'。 BindingExpression:PATH = DELETERECORD。 dataItem = 'ListCollectionView' (HashCode = 12713695)。ターゲット要素は 'MenuItem'(name = '')です。目標 プロパティは 'command'( 'icommand'タイプ ')

この状態では、データバインディングシステムは、<コード> MenuItem の DataContext DeleteRecord DataContext DeleteRecord DataContext が見つけようとしている。 > ListCollectionView

だから、あなたの式を考える

<事前> <コード> DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}

PlacementTarget.DataContext ListCollectionView の型であることが明らかです。 PlacementTarget ListView 自体であるため、<コード> ListView <コード> MenuItem0 はこの MenuItem1 <です。 / CODE>オブジェクト。

私はあなたの<コード> MenuItem2 の MenuItem3 を次のように定義します。

<事前> <コード> MenuItem4

より良い解決策は、<コード> ListCollectionView17 (したがって)からの値を「継承」するように、<コード> MenuItem5 <コード> MenuItem6 のみを離れることです。 MenuItem9

のバインディングを変更しながら、 MenuItem8 になるでしょう。 <事前> <コード> DataContext0
 

Let's look at the error message more precisely.

BindingExpression path error: 'DeleteRecord' property not found on 'object' ''ListCollectionView' (HashCode=12713695)'. BindingExpression:Path=DeleteRecord; DataItem='ListCollectionView' (HashCode=12713695); target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')

This states, that the data binding system tries to find a DeleteRecord property in the MenuItem's DataContext which is of type ListCollectionView.

So, considering your expression

DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}} 

it's clear that the PlacementTarget.DataContext is of type ListCollectionView too. Since PlacementTarget is the ListView itself, it's obvious that the ListView's DataContext is this ListCollectionView object.

I suppose, you define your ListView's DataContext somehow like this:

<ListView DataContext="{Binding Items}" ItemsSource="{Binding}"/> 

The better solution would be to leave the ListView's DataContext alone so that it "inherits" it's value from your UserControl (thus will be of type ProductRecordViewModel) while changing the binding for the ItemsSource:

<ListView ItemsSource="{Binding Items}"/> 
</div
 
 
-1
 
vote

データテンプレートでProductRecordViewがなぜなのですか?リスト項目がPRVMにバインドされているPRVの疑いがあります - それは正しいですか?この

のようなもの <事前> <コード> DataContext1

その場合、問題はListViewItemsのDataContextがListView自体と同じではないということです。代わりに、ListViewItemsのコンテキストメニューを直接:

のコンテキストメニューが必要です。 <事前> <コード> DataContext2
 

Why is the ProductRecordView in a datatemplate? I get the suspicion that the list items are PRV which is each bound to a PRVM - is that correct? Something like this

<ListView>     <ListView.ContextMenu>             <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">                 <MenuItem Header="Delete" Command="{Binding Path=DeleteRecord}"/>             </ContextMenu>         </ListView.ContextMenu>     <ListView.ItemTemplate>         <DataTemplate DataType="{x:Type vm:ProductRecordViewModel}">             <vw:ProductRecordView /> <!-- each PRV is bound to a PRVM - which as the delete record command -->         </DataTemplate>     </ListView.ItemTemplate> </ListView> 

If that is the case, then the problem is that datacontext of the listviewitems is not the same as the listview itself. Instead you probably want the context menu on the listviewitems directly:

<ListView>                 <ListView.ItemTemplate>             <DataTemplate DataType="{x:Type vm:ProductRecordViewModel}">                 <vw:ProductRecordView>                     <vw:ProductRecordView.ContextMenu>                         <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">                             <MenuItem Header="Delete" Command="{Binding Path=DeleteRecord}"/>                         </ContextMenu>                     <vw:ProductRecordView.ContextMenu>                 </vw:vw:ProductRecordView>             </DataTemplate>         </ListView.ItemTemplate>     </ListView> 
</div
 
 
 
 

関連する質問

0  WPF / ADO.NETデータサービスアプリケーションをMVVMパターンに変換する - 例  ( Converting wpf ado net data services application to the mvvm pattern example ) 
私はC#で書かれたWPFアプリケーションを持っています。このアプリケーションは、特定のデザインパターンを念頭に置いて書かれていませんが、私が学んだ.NETは、MVVMモデルが適していることに気付きました。したがって、コードの変換を開始します。 これは私がMVV...

1  DataGridからEFへの行を添付する最善の方法  ( Best way to attach row from datagrid to ef ) 
MVVMとEFを使用して...ビューモデルへのDataGridバインディング(ObservableCollectionを使用)。ビューモデルには、データコンテキストのsaveChangesコマンドを単純に呼び出すシェアコマンドがあります。ただし、ユーザーがD...

2  WPF / SilverlightのMVVMパターンには、IronpythonまたはIronRubyが適していますか?  ( Are ironpython or ironruby well suited for the mvvm pattern in wpf silverlight ) 
WPFとSilverlightアプリのModel-View-ViewModel(MVVM)パターンをC#と組み合わせて使用​​しています。宣言的なXAMLマークアップとデータバインディングは貴重です - 私なしでは生きることはできません。しかし、このTalk...

4  プログラム的に作成されたボタンを使用してWPF MVVMでonclickコマンドを作成するにはどうすればよいですか。  ( How do you create an onclick command in wpf mvvm with a programmatically created ) 
私はプログラムで数ボタンを作成するWPFアプリケーションを書いています。 ViewModelのボタンのonclickコマンドをどのように作成しますか? ResetButtonですべてのTextBoxesを消去するコマンドを追加します。 <事前> <コード> n...

47  WPF(MVVM):ViewModelからのビューを閉じる?  ( Wpf mvvm closing a view from viewmodel ) 
MVVMを使用してビューモデルでビューを閉じるという賢い方法に出かけていますか? ビュー(ウィンドウ)をシグナルにするためのバインディングを使用する方法がある? 私は誰でも持っている入力に本当に感謝します。 基本的にLoginViewModelにバインドされ...

14  WPFテキストボックスの数値エントリのみを許可します  ( Allow only numeric entry in wpf text box ) 
ユーザーエントリを検証して、それらが整数であることを確認します。どうやってやることができますか? WPFでの検証を行う「正しい」方法のように思われる IDataErrorInfo を使用することを考えました。だから私はそれを実装しようとしました、私のビューモデ...

0  MVVMパターンにおけるWPFデータ仮想化  ( Wpf data virtualization in mvvm pattern ) 
私はMVVMパターンでデータ仮想化を実装する方法を知りたいですか? 私は検索しましたが、MVVMパターンを使ってデータ仮想化を見つけました。 このリンクは、データの仮想化を非常に良く説明していますが、MVVMではなく、ありません。 http://www....

1  MVVM WPFデータバンドチェックボックスは、チェックボックスをオンにしてチェックボックスと未チェックの状態でイベントを発射しません  ( Mvvm wpf databound checkbox wont firing events to the viewmodel for checked and ) 
WPFとMVVMを使用して、 DataGrid の内部にデータバインド<コード> CheckBox を持っています。 <事前> <コード> <DataGridTemplateColumn Width="80" Header="Enabled"> <D...

2  視覚的な状態を推進するためのMVVMの適切な方法  ( Proper way in mvvm to drive visual states ) 
4つの異なるアプリケーションページのうちの1つを表示できるコンテンツ発表者を考えると、ビューモデル状態に基づくページ間の遷移をフェード/そうでなければアニメートしたいと考えています。理想的には、これらすべてがDataTemplate内で定義されていることをお...

0  NULLとのデータビューのデータビンディングとしてのItemsSource  ( Itemssource as dataview binding with null ) 
DataGridから継承した自分のコントロールを作成し、現在のビュー魔女の名前を付けたプロパティを設定しました。 <事前> <コード> if (ItemsSource is DataTable) { CurrentVi...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有