я просматривал другие темы, касающиеся привязки данных к контекстным меню, но я не мог понять, как заставить его работать, поскольку предложения/ответы не работали для меня.
у меня есть список, который привязан к ObversableCollection - отлично работает.
теперь у меня есть контекстное меню внутри этого списка. это контекстное меню имеет 4 элемента для активации, деактивации и т. д. выбранной задачи (это элемент, представленный в списке).
из-за разрешений мне нужно контролировать, включены ли элементы в contextmenu или отключены, поэтому я должен установить IsEnabled-Property ContextMenuItem, привязав его к той же коллекции, к которой привязан Listbox.
но по какой-то причине элементы контекстного меню не отключаются - свойство, похоже, игнорируется.
EDIT: теперь я реализовал ваше предложение:
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);
}
}
}
почему-то нет изменений!