簡體   English   中英

如何根據DataGrid中的條件啟用和禁用動態上下文菜單?

[英]How to enable and disable dynamic context menu based on condition in DataGrid?

我現在用的ContextMenu中WPF,它顯示發送和重新發送MenuItemContextMenu 如何使用以下代碼中的“ SendResend菜單項啟用/禁用上下文菜單?

<DataGrid.ContextMenu>
    <ContextMenu x:Name="CMenuu"> 
        <MenuItem Name="Send" Header="Send" Click="Send_Click"/>
        <MenuItem Name="Resend" Header="Resend" Click="Resend_Click"/>
        <MenuItem Name="Report"Header="Report" Click="Report_Click"/>
    </ContextMenu>
</DataGrid.ContextMenu>

請在此處找到我的示例解決方案,以通過在后面的代碼中添加contextmenu項目及其啟用/禁用功能來實現此功能。 經過全面測試,可為您提供功能。

我在這里粘貼完整的示例代碼

主窗口

<Window x:Class="yourapplicatioName.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">
    <Grid>
            <DataGrid x:Name="data1" AutoGenerateColumns="True"  ItemsSource="{Binding Path=.}"  Width="500" Height="500" PreviewMouseRightButtonDown="data1_PreviewMouseRightButtonDown_1">
            </DataGrid>

    </Grid>
</Window>

Mainwindow.xaml.cs

public MainWindow()
        {
            InitializeComponent();
            BindDataToDataGrid();
        }


        private void Send_Click_1(object sender, RoutedEventArgs e)
        {

        }

        private void Resend_Click_1(object sender, RoutedEventArgs e)
        {

        }

        private void Report_Click_1(object sender, RoutedEventArgs e)
        {

        }

        public static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }
                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void BindDataToDataGrid()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID");
            dt.Columns.Add("StatusCode");
            dt.Rows.Add("Kartik", "Send");
            dt.Rows.Add("Ashok", "Resend");
            dt.Rows.Add("Paresh", "Report");
            dt.AcceptChanges();

            data1.ItemsSource = dt.DefaultView;
        }

        private void data1_PreviewMouseRightButtonDown_1(object sender, MouseButtonEventArgs e)
        {
            if (e.OriginalSource.GetType() != typeof(DataGridColumnHeader))
            {
                DataGridRow dgr = FindVisualParent<DataGridRow>(e.OriginalSource as UIElement);
                if (dgr != null && dgr.Item != null)
                {
                    //here checked value of statuscode on the basis of row clicked
                    string statusCode = Convert.ToString((dgr.Item as DataRowView).Row["StatusCode"]);

                    if (statusCode == "Send")
                    {
                        MenuItem objResend = new MenuItem();
                        objResend.Header = "Resend";
                        objResend.Click += Resend_Click_1;

                        MenuItem objsend = new MenuItem();
                        objsend.Header= "Send";
                        objsend.IsEnabled = false;

                        data1.ContextMenu = new System.Windows.Controls.ContextMenu();

                        data1.ContextMenu.Items.Add(objResend);
                        data1.ContextMenu.Items.Add(objsend);
                    }
                    else if (statusCode == "Resend")
                    {
                        //on resend resend is disabled
                        MenuItem objResend = new MenuItem();
                        objResend.Header = "Resend";
                        objResend.IsEnabled = false;

                        MenuItem objsend = new MenuItem();
                        objsend.Header = "Send";
                        objsend.Click += Send_Click_1;

                        data1.ContextMenu = new System.Windows.Controls.ContextMenu();
                        data1.ContextMenu.Items.Add(objResend);
                        data1.ContextMenu.Items.Add(objsend);
                    }
                    else if (statusCode == "Report")
                    {
                        //both are enabled 
                        MenuItem objResend = new MenuItem();
                        objResend.Header = "Resend";
                        objResend.Click += Resend_Click_1;

                        MenuItem objsend = new MenuItem();
                        objsend.Header = "Send";
                        objsend.Click += Send_Click_1;

                        data1.ContextMenu = new System.Windows.Controls.ContextMenu();
                        data1.ContextMenu.Items.Add(objResend);
                        data1.ContextMenu.Items.Add(objsend);
                    }
                }
            }
        }

在這里,我處理了右​​鍵單擊datagridrow的contextmenu打開。 您可以將其更改為任何鼠標事件,例如Previewmousebuttondown,previewmouserightbuttondown ..您只需要在xaml中進行相關更改即可處理特定事件。

如果確實有幫助,請標記為解決方案.. 如果有任何疑問或疑問。 請告訴我

只需創建新功能並在各自的文件中添加xaml和xaml.cs以上,您就會更好地了解此代碼的實際作用

當上下文菜單項較少時,以上代碼是可行的;菜單項較多時,建議不要執行以上代碼。

在共享的Skydrive位置下面的圖像中查找工作代碼結果: http : //1drv.ms/1sJF6WQ

自從您提出要求以來,我希望以此為答案,希望代碼可以照常運行,但我現在沒有測試手段。 稍后,我將進行檢查並進行相應的更正。 最簡單的方法(但如果不使用MVVM,則不是),將在MenuItemClick處理程序中執行以下操作:

private void Send_Click(object sender, RoutedEventArgs e)
{
  Send.IsEnabled = false;
  Resend.IsEnabled = true;
}

private void Resend_Click(object sender, RoutedEventArgs e)
{
  Send.IsEnabled = true;
  Resend.IsEnabled = false;
}

但是,這是“快速而又骯臟的”,如果您不希望一開始就同時啟用兩個菜單項,則應將以下內容添加到XAML標記中:

<MenuItem Name="Resend" Header="Resend" Click="Resend_Click" IsEnabled="False"/>

希望這會有所幫助,並且我理解正確。

編輯 :似乎還有其他希望。 我希望這次能得到。 您可以在ContextMenu定義中為Opened事件添加處理程序,例如

<ContextMenu x:Name="cMenuu" Opened="cMenuu_Opened"> ...

然后執行以下操作(由於您沒有提供狀態信息的代碼,因此我只能在這里猜測):

private void cMenuu_Opened(object sender, RoutedEventArgs e)
{
  // Here, get the selected item from your grid and check the status
  var item = yourGridNameHere.SelectedItem;

  // Again: pseudo code to check the status
  if (item.Status == "reported")
  {
    Send.IsEnabled = false;
    Resend.IsEnabled = true;
  }
  else
  {
    // Something else, like enable the other menu items again
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM