जहां तक मुझे पता है, कुछ क्रियाएं पंक्ति के आधार पर अक्षम या सक्षम हो जाएंगी, इसलिए कोई नहीं है DataGrid
के लिए एक ContextMenu
में इंगित करें।
मेरे पास पंक्ति-स्तर संदर्भ मेनू का एक उदाहरण है।
<UserControl.Resources>
<ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit" Command="{Binding EditCommand}"/>
</ContextMenu>
<Style x:Key="DefaultRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
</Style>
</UserControl.Resources>
<DataGrid RowStyle="{StaticResource DefaultRowStyle}"/>
DataGrid
आदेशों के साथ दृश्य मॉडल की एक सूची के लिए एक बाध्यकारी होना चाहिए:
public class ItemModel
{
public ItemModel()
{
this.EditCommand = new SimpleCommand
{
ExecuteDelegate = _ => MessageBox.Show("Execute"),
CanExecuteDelegate = _ => this.Id == 1
};
}
public int Id { get; set; }
public string Title { get; set; }
public ICommand EditCommand { get; set; }
}
संदर्भ मेनू UserControl
के संसाधनों संग्रह में बनाई गई है और मुझे लगता है कि केवल एक ही वस्तु है जो डेटा द्वारा संदर्भित डेटाग्रिड पंक्तियों से जुड़ा हुआ है, मूल्य से नहीं।
के लिए के अंदर ContextMenu
का एक और उदाहरण यहां दिया गया है। मुझे लगता है DataGrid
DataContext
के रूप में एक सही दृश्य मॉडल, भी CommandParameter विशेषता कमान विशेषता से पहले रखा जाना चाहिए है कि:
<ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit" CommandParameter="{Binding}"
Command="{Binding DataContext.DataGridActionCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
</ContextMenu>
मॉडल:
public class MainViewModel
{
public MainViewModel()
{
this.DataGridActionCommand = new DelegateCommand<ItemModel>(m => MessageBox.Show(m.Title), m => m != null && m.Id != 2);
}
public DelegateCommand<ItemModel> DataGridActionCommand { get; set; }
public List<ItemModel> Items { get; set; }
}
public class ItemModel
{
public int Id { get; set; }
public string Title { get; set; }
}
लेकिन वहाँ एक समस्या यह है कि MenuItem
'isn हैगलत होने पर अक्षम आइटम के रूप में प्रदर्शित नहीं किया गया है। संभावित कामकाज के अंदर ParentModel
संपत्ति का उपयोग कर रहा है, लेकिन यह पहले समाधान से काफी अलग नहीं है।
public class ItemModel
{
public int Id { get; set; }
public string Title { get; set; }
public MainViewModel ParentViewModel { get; set; }
}
//Somewhere in the code-behind, create the main view model
//and force child items to use this model as a parent model
var mainModel = new MainViewModel { Items = items.Select(item => new ItemViewModel(item, mainModel)).ToList()};
और XAML में MenuItem सरल हो जाएगा::
<MenuItem Header="Edit" CommandParameter="{Binding}"
Command="{Binding ParentViewModel.DataGridActionCommand}" />
धन्यवाद नमूने के लिए, मैं इसे एक कोशिश दे देंगे यहाँ ऊपर-वर्णित समाधान के उदाहरण है। लेकिन, आपके जैसे, मुझे भी यही संदेह है, क्या केवल एक संदर्भ मेनू ऑब्जेक्ट है? मुझे इसमें खोदना होगा। – Jay
मैंने इसका परीक्षण किया, और प्रत्येक पंक्ति के कॉन्टेक्स्टमेनस के हैश कोड की तुलना करके यह वही मूल्य प्रदान करता है, इसलिए यह वही वस्तु होनी चाहिए.नहीं! क्या मुझे वास्तव में प्रत्येक पंक्ति के लिए कमांड की आवश्यकता है? मैं मुख्य व्यूमोडेल के अंदर, शीर्ष पर बैठे माता-पिता कमांड की तरह उपयोग करना चाहता था। क्या यह मेनूइटम में कमांड बाध्यकारी समायोजित करके किया जा सकता है? मैं इसे काम नहीं कर सकता! अरे यह ... – Jay
@Jay क्या आपका मतलब एक स्थिर रूटेड कमांड है? वास्तव में पंक्ति-स्तर के आदेशों के बजाय ईवेंट हैंडलर या वैश्विक आदेशों का उपयोग करना संभव है। मैं कल इसी तरह कुछ लागू करने की कोशिश करूंगा, और यदि आप प्रश्न के लिए अपने आदेश का कोड जोड़ सकते हैं तो इससे मेरी मदद मिलेगी। – vorrtex