2011-03-05 7 views
13

मेरे पास एक डाटाग्रिड है जिसमें संभावित रूप से कई पंक्तियां हो सकती हैं। चूंकि उपयोगकर्ता सही पंक्तियों में से एक पर क्लिक करता है, इसलिए मुझे प्रत्येक पंक्तियों के लिए एक संदर्भ मेनू दिखाने की आवश्यकता होती है और जब उपयोगकर्ता विकल्प पर क्लिक करता है तो एक क्रिया (वर्तमान क्रिया के अनुसार एक ही क्रिया लेकिन अलग-अलग डेटा आइटम) करने की आवश्यकता होती है।डेटाग्रिड पंक्तियों के लिए संदर्भमेन बनाएँ

इसके लिए सबसे अच्छी रणनीति क्या है?

मुझे डर है कि प्रत्येक पंक्ति के लिए एक कॉन्टेक्स्टमेनू ओवरकिल है, भले ही मैं ContextMenuOpening ईवेंट का उपयोग कर मेनू बना रहा हूं, संदर्भ मेनू के लिए "आलसी लोड" की तरह। क्या मुझे डेटाग्रिड के लिए केवल एक कॉन्टेक्स्टमेनू का उपयोग करना चाहिए? लेकिन इसके साथ में क्लिक पंक्ति के बारे में कुछ और काम होगा, सही पंक्ति निर्धारित करने के लिए,

उत्तर

29

जहां तक ​​मुझे पता है, कुछ क्रियाएं पंक्ति के आधार पर अक्षम या सक्षम हो जाएंगी, इसलिए कोई नहीं है 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 का एक और उदाहरण यहां दिया गया है। मुझे लगता है DataGridDataContext के रूप में एक सही दृश्य मॉडल, भी 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}" /> 
+0

धन्यवाद नमूने के लिए, मैं इसे एक कोशिश दे देंगे यहाँ ऊपर-वर्णित समाधान के उदाहरण है। लेकिन, आपके जैसे, मुझे भी यही संदेह है, क्या केवल एक संदर्भ मेनू ऑब्जेक्ट है? मुझे इसमें खोदना होगा। – Jay

+0

मैंने इसका परीक्षण किया, और प्रत्येक पंक्ति के कॉन्टेक्स्टमेनस के हैश कोड की तुलना करके यह वही मूल्य प्रदान करता है, इसलिए यह वही वस्तु होनी चाहिए.नहीं! क्या मुझे वास्तव में प्रत्येक पंक्ति के लिए कमांड की आवश्यकता है? मैं मुख्य व्यूमोडेल के अंदर, शीर्ष पर बैठे माता-पिता कमांड की तरह उपयोग करना चाहता था। क्या यह मेनूइटम में कमांड बाध्यकारी समायोजित करके किया जा सकता है? मैं इसे काम नहीं कर सकता! अरे यह ... – Jay

+0

@Jay क्या आपका मतलब एक स्थिर रूटेड कमांड है? वास्तव में पंक्ति-स्तर के आदेशों के बजाय ईवेंट हैंडलर या वैश्विक आदेशों का उपयोग करना संभव है। मैं कल इसी तरह कुछ लागू करने की कोशिश करूंगा, और यदि आप प्रश्न के लिए अपने आदेश का कोड जोड़ सकते हैं तो इससे मेरी मदद मिलेगी। – vorrtex

संबंधित मुद्दे