Предайте параметър чрез контекстното меню към DevExpress TreeListControl

Имам TreeListControl и бих искал да предам избрания ред като параметър в моето контекстно меню. Така че контролът ми изглежда така:

Преглед:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
        xmlns:dxt="http://schemas.devexpress.com/winfx/2008/xaml/grid" >

    <dxt:TreeListControl Name="treeList" ItemsSource="{Binding MyCollection}">

        <!-- Context menu I AM HAVING TROUBLE HERE PASSING A PARAMETER TO THE COMMAND -->
        <dxt:TreeListControl.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Mount"
                    Command="{Binding MyCustomCommand}"   
                    CommandParameter="{Binding SELECTED_JUST_CLICKED_ROW_OF_THIS_CONTROL}">
                    <MenuItem.Icon>
                        <Image Source="/Server;component/Images/SomeImage.png" Width="40"  />
                    </MenuItem.Icon>
                </MenuItem>
            </ContextMenu>
        </dxt:TreeListControl.ContextMenu>

        <!-- Columns of the control -->
        <dxt:TreeListControl.Columns>                     
            <dxt:TreeListColumn FieldName="Name" Header="Name"/>
            <dxt:TreeListColumn FieldName="Position" Header="Position"/> 
        </dxt:TreeListControl.Columns>
        <!-- View -->
        <dxt:TreeListControl.View>
            <dxt:TreeListView Name="treeListView1" AutoWidth="True"
                              KeyFieldName="ID" ParentFieldName="ParentID"/>
        </dxt:TreeListControl.View>
    </dxt:TreeListControl>

</Window>

Код отзад

using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {        
        // Properties that are binded on View
        public ObservableCollection<Employee> MyCollection {get;set;}
        public MyCommand MyCustomCommand { get; set; }

        public MainWindow ( )
        {
            InitializeComponent( );

            // init properties
            MyCollection = new ObservableCollection<Employee>();
            MyCustomCommand = new MyCommand();

            // bind properties to view
            this.DataContext = this;

            // add items to observable collection
            foreach(var employee in GetStuff() )
                 MyCollection.Add( employee );              
        }

        // generate employees
        public static List<Employee> GetStuff ( )
        {
            List<Employee> stuff = new List<Employee>( );

            stuff.Add( new Employee() { ID = 2 , ParentID = 0 , Name = "Irma R. Marshall" } );    
            stuff.Add( new Employee() { ID = 6 , ParentID = 2 , Position = "Brian C. Cowling" } );
            stuff.Add( new Employee() { ID = 7 , ParentID = 2 , Position = "Thomas C. Dawson" } );                                        
            return stuff;
        }        
    }
}

public class Employee
{
    public int ID { get; set; }
    public int ParentID { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
}

public class MyCommand : ICommand
{                
    public bool CanExecute ( object parameter )
    {
        // Here I want parameter to be selected ROW!!!!
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute ( object parameter )
    {
        // Here I want parameter = selected row !!!!

        // based on value of parameter perform logic
    }
}

Всичко работи освен CommandParameter. Опитвал съм неща като:

CommandParameter="{Binding RowHandle.Value}"
CommandParameter="{Binding Data.Name}"
CommandParameter="{Binding Data}"
CommandParameter="{Binding ElementName=treeList, Path=Name}"

всички те връщат нула... Единственият параметър, който успях да предам е:

CommandParameter="Foo"

редактиране

DevExpress отговори на въпроса на: http://www.devexpress.com/Support/Center/Question/Details/Q473660


person Tono Nam    schedule 08.02.2013    source източник
comment
Видях, че член на devex публикува решение за вас. те винаги са най-добрите хора, които да попитате, когато става въпрос за техните контроли :)   -  person Abdusalam Ben Haj    schedule 08.02.2013
comment
Да, току-що поставих редакция, която показва връзката, където да намеря отговора. Беше по-сложно, отколкото си мислех. @ethicallogics публикува работещо решение, но предаването на действително избрания ред беше трудно...   -  person Tono Nam    schedule 09.02.2013


Отговори (1)


<ContextMenu Name="MyContextMenu" Tag="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
            <MenuItem Header="Mount" Command="{Binding MyCustomCommand}" CommandParameter="{Binding Tag , ElementName= MyContextMenu}"/>
        </ContextMenu>

Това ще ви даде контрола, върху който отваряте това контекстно меню. Надявам се, че това ще ви даде представа.

person yo chauhan    schedule 08.02.2013
comment
Няма смисъл защо не работи. Отговорът ви има много смисъл, но по някаква причина все още получавам нула :( . - person Tono Nam; 08.02.2013
comment
Вашият отговор работи, ако е ContextMenu на listView например, но контролата DevExpress го кара да не работи по някаква причина. - person Tono Nam; 08.02.2013
comment
Това е нула, защото контроли като ToolTip и ContextMenu не са част от Tree, така че не можете да ги обвържете директно, както го правите с други контроли. Тези контроли имат свойство, наречено PlacementTarget, което дава контролата, на която са отворени. - person yo chauhan; 08.02.2013
comment
По-добър отговор може да бъде намерен на: devexpress.com/Support/Center/Question/ Подробности/Q473660. Отбелязвам отговора ви като правилен, тъй като беше полезен и работи! - person Tono Nam; 09.02.2013