[英]How to enable and disable dynamic context menu based on condition in DataGrid?
我現在用的ContextMenu
中WPF,它顯示發送和重新發送MenuItem
中ContextMenu
。 如何使用以下代碼中的“ Send
和Resend
菜單項啟用/禁用上下文菜單?
<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,則不是),將在MenuItem
的Click
處理程序中執行以下操作:
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.