2013-08-16 2 views
0

Я смотрел на другие темы, касающиеся привязки данных к контекстуменю, но я не мог понять, как заставить его работать, поскольку предложения/ответы не будут работать для меня.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); 
     } 
    } 
} 

по какой-то причине нет никаких изменений!

ответ

0

Вы можете попробовать использовать команду привязок (вам потребуется prism):

... 
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
    <MenuItem Command="{Binding StartCommand}"/> 
    ... 
</ContextMenu> 
... 

...

using Microsoft.Practices.Composite.Presentation.Commands; 

public class currentJob 
{ 
    public ICommand StartCommand {get; private set;} 
    public currentJob() 
    { 
     StartCommand = new DelegateCommand(ExecuteStart, CanExecuteStart); 
    } 

    private bool CanExecuteStart() 
    { 
     //Determine whether start can be executed 
     return true; 
    } 

    private void ExecuteStart() 
    { 
     //start here 
    } 
} 

Здесь ExecuteStart заменяет startJob и CanExecuteStart заменяет в исходном примере enablePermitted.


Редактировать Это, вероятно, помогает объяснить, почему исходный код не работает. Изменения привязанных свойств снимаются, только если событие объекта PropertyChange запускается объектом объекта. Реализация INotifyPropertyChanged, вероятно, также устранит вашу проблему.


Редактировать Еще более тривиальная проблема с исходным кодом является то, что оно является обязательной к неверному объекту - я полагаю, никакой собственности startPermitted существует на FeedContextMenu (который в любом случае, кажется, не быть определен).


Редактировать Есть еще несколько вопросов выше: 1) привязки чувствительны к регистру, поэтому связывание должно быть {Binding} и т.д. Команда пуска 2) Вы должны установить на контекстное меню отдельные элементы в списке. Было бы работать:

<ListView Margin="10,10,10,55" Name="listviewCurrentJobs" ItemsSource="{Binding JobCollection}"> 
     <ListView.ItemTemplate> 
       <DataTemplate> 
       <Border BorderBrush="Black" BorderThickness="2"> 
        <StackPanel Orientation="Horizontal" MinHeight="20" Background="White"> 
         <StackPanel.ContextMenu> 
          <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
           <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> 
         </StackPanel.ContextMenu> 
         <Image Source="{Binding State}" Width="16"/> 
        </StackPanel> 
       </Border> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
+0

это не отключит кнопку, не так ли? –

+0

Если CanExecuteStart возвращает false, тогда кнопка будет отключена – mickeyt

+0

Теперь я обновил вопрос, это не сработает до этого момента. –

 Смежные вопросы

  • Нет связанных вопросов^_^