Hello,
I'm using RadMenu in a "C#-WPF-MVVM-Microsoft Prism" application.
I have made a very simple example that reproduces the problem. In this example, I have a "File" menu with two items: "Open" and "Close".
At first, I want the "Open" item to be enabled, and the "Close" item to be disabled since there is nothing to close.
When the user clicks on "Open", the open operation is called via a Prism DelegateCommand.
After this, I want the "Open" item to be disabled and the "Close" item to be enabled.
If you run the example, you will see that now both items are disabled.
MainWindow.xaml:
MainWindow.xaml.ca:
ViewModel.cs :
Did I missed something?
Thanks
Mart71
I'm using RadMenu in a "C#-WPF-MVVM-Microsoft Prism" application.
I have made a very simple example that reproduces the problem. In this example, I have a "File" menu with two items: "Open" and "Close".
At first, I want the "Open" item to be enabled, and the "Close" item to be disabled since there is nothing to close.
When the user clicks on "Open", the open operation is called via a Prism DelegateCommand.
After this, I want the "Open" item to be disabled and the "Close" item to be enabled.
If you run the example, you will see that now both items are disabled.
MainWindow.xaml:
<
Window
x:Class
=
"WpfApplication1.MainWindow"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
xmlns:Effects
=
"clr-namespace:Telerik.Windows.Controls.ColorEditor.Effects;assembly=Telerik.Windows.Controls.Input"
mc:Ignorable
=
"d"
Title
=
"MainWindow"
Height
=
"350"
Width
=
"525"
>
<
Window.Resources
>
<
Style
x:Key
=
"MenuStyle"
TargetType
=
"telerik:RadMenuItem"
>
<
Setter
Property
=
"Header"
Value
=
"{Binding Name}"
/>
<
Setter
Property
=
"ItemsSource"
Value
=
"{Binding ItemsCollection}"
/>
<
Setter
Property
=
"Command"
Value
=
"{Binding MenuItemCommand}"
/>
</
Style
>
</
Window.Resources
>
<
Grid
>
<
telerik:RadMenu
x:Name
=
"radMenu"
ItemsSource
=
"{Binding MenusCollection}"
ItemContainerStyle
=
"{StaticResource MenuStyle}"
HorizontalAlignment
=
"Left"
VerticalAlignment
=
"Top"
>
</
telerik:RadMenu
>
</
Grid
>
</
Window
>
MainWindow.xaml.ca:
namespace
WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public
partial
class
MainWindow : Window
{
ViewModel _viewModel =
new
ViewModel();
public
MainWindow()
{
InitializeComponent();
base
.DataContext = _viewModel;
}
}
}
ViewModel.cs :
using
System;
using
System.ComponentModel;
using
System.Collections.Generic;
using
System.Collections.ObjectModel;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
Microsoft.Practices.Prism.Events;
using
Microsoft.Practices.Prism.ViewModel;
using
Microsoft.Practices.Prism.Commands;
namespace
WpfApplication1
{
public
delegate
void
MenuActionDelegate(
object
command);
public
delegate
bool
MenuIsEnabledDelegate(
object
command);
public
class
ViewModel : NotificationObject
{
public
ViewModel()
{
_menusCollection =
new
ObservableCollection<MyMenuItem>();
MyMenuItemInfo menuInfo =
new
MyMenuItemInfo(
"File"
, 1,
null
,
null
);
MyMenuItemInfo itemInfo =
new
MyMenuItemInfo(
"Open"
, 10, MenuAction, IsClosed);
AddMenu(menuInfo, itemInfo);
itemInfo =
new
MyMenuItemInfo(
"Close"
, 20, MenuAction, IsOpened);
AddMenu(menuInfo, itemInfo);
}
private
bool
_isOpen;
public
bool
IsOpened(
object
command)
{
return
_isOpen;
}
public
bool
IsClosed(
object
command)
{
return
!_isOpen;
}
public
void
MenuAction(
object
command)
{
if
((
int
)command == 10)
{
_isOpen =
true
;
}
else
if
((
int
)command == 20)
{
_isOpen =
false
;
}
}
private
ObservableCollection<MyMenuItem> _menusCollection {
get
;
set
; }
public
ObservableCollection<MyMenuItem> MenusCollection
{
get
{
return
this
._menusCollection; }
}
public
void
AddMenu(MyMenuItemInfo menuInfo, MyMenuItemInfo itemInfo)
{
bool
menuExists =
false
;
MyMenuItem theMenu =
null
;
foreach
(MyMenuItem menu
in
_menusCollection)
{
if
(menu.Name == menuInfo.Name)
{
theMenu = menu;
menuExists =
true
;
}
}
if
(menuExists)
{
theMenu.AddMenuItem(itemInfo);
}
else
{
MyMenuItem newMenu =
new
MyMenuItem(menuInfo);
newMenu.AddMenuItem(itemInfo);
_menusCollection.Add(newMenu);
}
}
}
public
class
MyMenuItem
{
public
MyMenuItem(MyMenuItemInfo itemInfo)
{
_itemInfo = itemInfo;
_menuItemsCollection =
new
ObservableCollection<MyMenuItem>();
MenuItemCommand =
new
DelegateCommand(MenuItemExecute, MenuItemCanExecute);
}
public
void
AddMenuItem(MyMenuItemInfo itemInfo)
{
MyMenuItem menuItem =
new
MyMenuItem(itemInfo);
_menuItemsCollection.Add(menuItem);
}
private
ObservableCollection<MyMenuItem> _menuItemsCollection {
get
;
set
; }
public
ObservableCollection<MyMenuItem> ItemsCollection
{
get
{
return
_menuItemsCollection; }
}
public
DelegateCommand MenuItemCommand {
get
;
private
set
; }
public
void
MenuItemExecute()
{
if
(_itemInfo.MenuAction !=
null
)
{
_itemInfo.MenuAction.Invoke(_itemInfo.Command);
MenuItemCommand.RaiseCanExecuteChanged();
}
}
private
bool
MenuItemCanExecute()
{
bool
itemIsEnabled =
true
;
if
(_itemInfo.IsEnabled !=
null
)
{
itemIsEnabled = _itemInfo.IsEnabled.Invoke(_itemInfo.Command);
}
return
itemIsEnabled;
}
private
MyMenuItemInfo _itemInfo;
public
string
Name
{
get
{
return
_itemInfo.Name; }
set
{ _itemInfo.Name = value; }
}
}
public
class
MyMenuItemInfo
{
public
MyMenuItemInfo(
string
name,
object
command, MenuActionDelegate menuAction, MenuIsEnabledDelegate isEnabled)
{
Name = name;
Command = command;
MenuAction = menuAction;
IsEnabled = isEnabled;
}
public
string
Name
{
get
{
return
_name; }
set
{ _name = value; }
}
public
object
Command
{
get
{
return
_command; }
set
{ _command = value; }
}
public
MenuActionDelegate MenuAction
{
get
{
return
_menuAction; }
set
{ _menuAction = value; }
}
public
MenuIsEnabledDelegate IsEnabled
{
get
{
return
_isEnabled; }
set
{ _isEnabled = value; }
}
private
string
_name;
private
object
_command;
private
MenuActionDelegate _menuAction;
private
MenuIsEnabledDelegate _isEnabled;
}
}
Did I missed something?
Thanks
Mart71