Как создать динамическое ContextMenu на DataGridCell - PullRequest
0 голосов
/ 30 января 2012

WPF, C #, у меня есть сетка данных с несколькими столбцами, много строк.Я хочу, чтобы каждая ячейка в строке имела разные пункты контекстного меню.

Как это сделать?спасибо, у меня есть

<UserControl.Resources>
        <ContextMenu x:Key="cellContextMenu">
            <MenuItem x:Name="menuFillUp" Header="Fill _Up" />
        </ContextMenu>
        <Style x:Key="DataGridCellStyle" TargetType="{x:Type dg:DataGridCell}">
            <Setter Property="ContextMenu" Value="{DynamicResource cellContextMenu}" />
        </Style>
        <Style x:Key="DataGridRowStyle"  TargetType="{x:Type dg:DataGridRow}">
            <Style.Triggers>
                <Trigger Property="AlternationIndex" Value="1" >
                    <Setter Property="Background" Value="Beige" />
                </Trigger>
            </Style.Triggers>
            <Setter Property="Margin" Value="0 2 0 2" />            
        </Style>
        <Style x:Key="DataGridStyle" TargetType="{x:Type dg:DataGrid}">
            <Setter Property="AlternationCount" Value="2" />
            <Setter Property="RowStyle" Value="{StaticResource DataGridRowStyle}" />
            <Setter Property="CellStyle" Value="{StaticResource DataGridCellStyle}" />
        </Style>
</UserControl.Resources>

, но это для уровня сетки данных.спасибо

1 Ответ

0 голосов
/ 31 января 2012

Мне удалось это сработать, xmal не изменился.В коде позади contextMenuOpening
я проверяю, по какому столбцу щелкнули, исходя из этого, я изменю заголовок menuitem

     private void basketDG_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        DependencyObject depObj = (DependencyObject)e.OriginalSource;
        while ((depObj != null) && !(depObj is Microsoft.Windows.Controls.DataGridCell))
        {
            depObj = VisualTreeHelper.GetParent(depObj);
        }
        if (depObj == null)
        {
            return;
        }
        if (depObj is Microsoft.Windows.Controls.DataGridCell)
        {
            var obj = depObj as Microsoft.Windows.Controls.DataGridCell;

            var menu = TryFindResource("cellContextMenu") as ContextMenu;
            if (menu != null && menu.Items.Count > 0)
            {
                var menuitem = menu.Items[0] as MenuItem;
                if (menuitem != null)
                {
                    var col = obj.Column.Header;
                    if(col.Equals("Column1") || col.Equals("Column1") 
                        || col.Equals("Column3") || col.Equals("Column4"))
                    {
                        menuitem.Header = "Set all to " + obj;
                        menu.Visibility = Visibility.Visible;
                    }
                    else
                    {
                        menu.Visibility = Visibility.Hidden;
                    }
                }
            }
        }
    } 

Однако возникает один новый вопрос, все столбцы - DataGridComboBoxColumn, контекстВ меню отображается «Установить все в Microsoft.Windows.Controls.DataGridCell», каждый DataGridComboBoxColumn связан с источником данных, поэтому я не знаю, как получить selectedValue объекта DataGridComboBoxColumn.Итак, мой вопрос, как получить выбранное значение DataGridComboBoxColumn?С другой стороны, если я могу знать, какая строка нажата, то я смогу определить selectedValue из этой строки.но я не знаю, как получить, какая строка щелкает для контекстного меню, либо.спасибо

Редактировать: мне удалось получить это таким образом var comboColumn = (obj.Content as ComboBox);if (comboColumn! = null) {menuitem.Header = "Установить все в" + comboColumn.Text;menu.Visibility = Visibility.Visible;}

Не элегантно, но работает.У кого-нибудь есть лучшее решение, пожалуйста, дайте мне знать.спасибо

...