wpf在数据网格中的可编辑单元格上动态显示上下文菜单

时间:2018-01-26 13:25:18

标签: c# wpf

场景是:

我有一个使用DataTable作为ItemsSource的数据网格。

dataGrid.ItemsSource = LogFileItemDataTable.DefaultView;

我可以在其中内联编辑字段,其中一个是文本框。

如果是文本框,我希望能够选择一些文本并动态调出上下文菜单,其中包含项目"包含..."和"不包含......"然后做一些事情。

但是我在尝试获取事件并将上下文菜单设置为当前正在编辑的文本框时遇到了麻烦。

我的数据网格没有显式设置列,它只使用带有数据表的ItemsSource。

  <DataGrid x:Name="dataGrid" Margin="10,35,10,40">
  </DataGrid>

2 个答案:

答案 0 :(得分:0)

如果您正在处理数据网格模板列,请在模板中添加以下内容:

<TextBox
  Name="cxmTextBox" 
  Grid.Row="1"
  AcceptsReturn="True"
  AcceptsTab="True"
  VerticalScrollBarVisibility="Visible"
  TextWrapping="Wrap"
>
  <TextBox.ContextMenu>
    <ContextMenu 
      Name="cxm"
      Opened="CxmOpened"
    >
      <MenuItem 
        Header="Contains"
        Name="cxmItemContains" 
        Click="ClickContains" 
      />
      <MenuItem 
        Header="Does not contain" 
        Name="cxmItemNotContain"
        Click="ClickNotContain" 
      />
    </ContextMenu>
  </TextBox.ContextMenu>
</TextBox>

并添加代码:

public void CxmOpened(Object sender, RoutedEventArgs args)
{
    // Only allow menu item if something is selected
    if (cxmTextBox.SelectedText == "")
        cxmItemContains.IsEnabled = cxmItemNotContains.IsEnabled = false;
    else
        cxmItemContains.IsEnabled = cxmItemNotContains.IsEnabled = true;

    // Only allow paste if there is text on the clipboard to paste.
    if (Clipboard.ContainsText())
        cxmItemPaste.IsEnabled = true;
    else
        cxmItemPaste.IsEnabled = false;
}

public void cxmItemContains(object sender, RoutedEventArgs e) { //do your stuff}

public void cxmItemNotContains(object sender, RoutedEventArgs e) { //do your stuff}

答案 1 :(得分:0)

RichTextBox DataGrid使用Cell,然后使用ContextMenu SelectionChanged从代码中调出Event。像这样:

<DataGridTemplateColumn Header="First" IsReadOnly="False" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RichTextBox x:Name="rtbFirst" SelectionChanged="rtbFirst_SelectionChanged">
                                <FlowDocument IsOptimalParagraphEnabled="True" IsHyphenationEnabled="True">
                                    <Paragraph>
                                       Some Text
                                    </Paragraph>
                                </FlowDocument>
                            </RichTextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

然后

private void rtbFirst_SelectionChanged(object sender, RoutedEventArgs e)
        {
            //do your context menu stuff here
        }