Я смотрел на другие темы, касающиеся привязки данных к контекстуменю, но я не мог понять, как заставить его работать, поскольку предложения/ответы не будут работать для меня.WPF привязка к IsEnabled свойства в ListBox 'ContextMenu's MenuItem
У меня есть список, связанный с ObversableCollection - это прекрасно работает.
Теперь у меня есть контекстное меню внутри этого списка. что contextmenu имеет 4 элемента для активации, деактивации и т. д. выбранной задачи (которая является элементом, представленным в списке).
из-за разрешений, мне нужно управлять, чтобы элементы в контекстном меню были включены или отключены, поэтому мне нужно установить IsEnabled-Свойство ContextMenuItem, привязывая его к той же коллекции, к которой привязан список.
но по какой-то причине элементы contextmenu не отключены - свойство, кажется, игнорируется.
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);
}
}
}
по какой-то причине нет никаких изменений!
это не отключит кнопку, не так ли? –
Если CanExecuteStart возвращает false, тогда кнопка будет отключена – mickeyt
Теперь я обновил вопрос, это не сработает до этого момента. –