我正在查看有关数据绑定到上下文菜单的其他线程,但我无法弄清楚如何让它工作,因为建议/答案对我不起作用。
我有一个列表框,它绑定到一个 ObversableCollection - 工作正常。
现在我在该列表框中有一个上下文菜单。该上下文菜单有 4 个项目来激活、停用等所选任务(这是列表框中表示的项目)。
由于权限,我需要控制上下文菜单中的项目是启用还是禁用,因此我必须通过将其绑定到与列表框绑定的同一个集合来设置 ContextMenuItem 的 IsEnabled-Property。
但由于某种原因,上下文菜单项没有被禁用 - 该属性似乎被忽略了。
编辑:我现在已经实施了你的建议:
WPF
<ListView Margin="10,10,10,55" Name="listviewCurrentJobs" ItemsSource="{Binding JobCollection}">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Starten" Command="{Binding Path=startCommand}"/>
<MenuItem Header="Stoppen" Command="{Binding Path=stopCommand}"/>
<MenuItem Header="Aktivieren" Command="{Binding Path=enableCommand}"/>
<MenuItem Header="Deaktivieren" Command="{Binding Path=disableCommand}"/>
<MenuItem Header="Löschen" Command="{Binding Path=deleteCommand}"/>
</ContextMenu>
</ListView.ContextMenu>
<ListView.View>
<GridView>
<GridViewColumn Header="" Width="32">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding State}" Width="16"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Description}" />
</GridView>
</ListView.View>
</ListView>
C#
public class currentJob : MonitoringWindow
{
public string State { get; set; }
public string Description { get; set; }
public bool startPermitted { get; set; }
public bool stopPermitted { get; set; }
public bool enablePermitted { get; set; }
public bool disablePermitted { get; set; }
public bool deletePermitted { get; set; }
public ICommand StartCommand { get; private set; }
public ICommand StopCommand { get; private set; }
public ICommand EnableCommand { get; private set; }
public ICommand DisableCommand { get; private set; }
public ICommand DeleteCommand { get; private set; }
public currentJob()
{
StartCommand = new DelegateCommand(ExecuteStart, CanExecuteStart);
StopCommand = new DelegateCommand(ExecuteStop, CanExecuteStop);
EnableCommand = new DelegateCommand(ExecuteEnable, CanExecuteEnable);
DisableCommand = new DelegateCommand(ExecuteDisable, CanExecuteDisable);
DeleteCommand = new DelegateCommand(ExecuteDelete, CanExecuteDelete);
}
public bool CanExecuteStart()
{
return startPermitted;
}
public bool CanExecuteStop()
{
return stopPermitted;
}
public bool CanExecuteEnable()
{
return enablePermitted;
}
public bool CanExecuteDisable()
{
return disablePermitted;
}
public bool CanExecuteDelete()
{
return deletePermitted;
}
public void ExecuteStart()
{
currentJob curJob = ((currentJob)listviewCurrentJobs.SelectedItem);
string curJobName = curJob.Name;
if (new TaskService().GetFolder("DocuWare Notifications").Tasks[curJobName].Enabled == false)
new TaskService().GetFolder("DocuWare Notifications").Tasks[curJobName].Enabled = true;
new TaskService().GetFolder("DocuWare Notifications").Tasks[curJobName].Run();
loadJobs();
}
public void ExecuteStop()
{
if (new TaskService().GetFolder("DocuWare Notifications").Tasks[((currentJob)listviewCurrentJobs.SelectedItem).Name].Enabled == true)
{
new TaskService().GetFolder("DocuWare Notifications").Tasks[((currentJob)listviewCurrentJobs.SelectedItem).Name].Stop();
loadJobs();
}
}
public void ExecuteEnable()
{
new TaskService().GetFolder("DocuWare Notifications").Tasks[((currentJob)listviewCurrentJobs.SelectedItem).Name].Enabled = true;
loadJobs();
}
public void ExecuteDisable()
{
new TaskService().GetFolder("DocuWare Notifications").Tasks[((currentJob)listviewCurrentJobs.SelectedItem).Name].Enabled = false;
loadJobs();
}
public void ExecuteDelete()
{
new TaskService().GetFolder("DocuWare Notifications").DeleteTask(((currentJob)listviewCurrentJobs.SelectedItem).Name);
if (isMsSql)
{
mssqlconn.Open();
new SqlCommand("DELETE FROM dbo.DocuWareNotifications WHERE NAME = '" + ((currentJob)listviewCurrentJobs.SelectedItem).Name + "'", mssqlconn).ExecuteNonQuery();
mssqlconn.Close();
}
else
{
mysqlconn.Open();
new MySqlCommand("DELETE FROM DocuWareNotifications WHERE NAME = '" + ((currentJob)listviewCurrentJobs.SelectedItem).Name + "'", mysqlconn).ExecuteNonQuery();
mysqlconn.Close();
}
loadJobs();
}
}
public partial class MonitoringWindow : MetroWindow
{
[...]
foreach (Task task in new TaskService().GetFolder("DocuWare Notifications").Tasks)
{
if (task != null)
{
currentJob item = new currentJob();
switch (task.State)
{
case TaskState.Disabled:
item.State = "/DWNotDesigner;component/images/disabled.png";
item.Description = task.Name;
break;
case TaskState.Ready:
item.State = "/DWNotDesigner;component/images/active.png";
item.Description = task.Name;
break;
case TaskState.Running:
item.State = "/DWNotDesigner;component/images/working.png";
item.Description = task.Name;
break;
}
item.startPermitted = startPermitted;
item.stopPermitted = stopPermitted;
item.enablePermitted = enablePermitted;
item.disablePermitted = disablePermitted;
item.deletePermitted = deletePermitted;
_jobCollection.Add(item);
}
}
}
由于某种原因没有变化!