В моем View привязка BarButtonItem к Command и Commandparmeter и привязка ItemLinkSource к MenuItems.привязка выделенной строки сетки данных к SelectedItem.Теперь я хочу передать SelectedItem в CommandParmeter во ViewModel.Даже я каждая команда в пунктах меню связывает разные командыParamer.
<UserControl.Resources>
<DataTemplate x:Key="BarItemTemplate">
<ContentControl>
<dxb:BarButtonItem Content="{Binding Caption}"
CommandParameter="{Binding CommandParameter}"
Command="{Binding Command}"/>
</ContentControl>
</DataTemplate>
</UserControl.Resources>
<dxb:BarManager>
<dxb:BarManager.Bars >
<dxb:Bar x:Name="mainMenuBar" IsMainMenu="True" ItemLinksSource="{Binding MenuItems}" ItemTemplate="{StaticResource BarItemTemplate}"/>
</dxb:BarManager.Bars>
<Grid >
<dxg:GridControl
ItemsSource="{Binding Model}">
<dxg:GridControl.Columns>
<dxg:GridColumn x:Name="colID" FieldName="Id" />
<dxg:GridColumn FieldName="UserName"/>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView FocusedRow="{Binding Path=SelectedItem,Mode=TwoWay}" AllowEditing="False" NavigationStyle="Row" ShowGroupPanel="False"/>
</dxg:GridControl.View>
</dxg:GridControl>
</Grid>
</dxb:BarManager>
Теперь я реализую свой ViewModel.Import MenuService, который содержит MenuItems, и добавляю новую команду int MenuItems и передаю SelectedItem в качестве parementer
public class ListViewModel : INotifyPropertyChanged, IPartImportsSatisfiedNotification
{
#region Import ------------------------------------
[Import(typeof(IMenuService))]
protected IMenuService MenuService { get; set; }
#endregion
#region Public fields----------------------------
public ObservableCollection<IMenuItem> MenuItems
{
get
{
return this.MenuService.MenuItems;
}
}
private object selectedItem;
public object SelectedItem
{
get { return selectedItem; }
set
{
if (selectedItem != value)
{
selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
}
#endregion
#region Public Fields-----------------
public DelegateCommand<object> NewCommand { get; private set; }
#endregion
#region Constrcator
public ListViewModel()
{
this.NewCommand = new DelegateCommand<object>(OnNewExcute, CanNewExcute);
}
#endregion
#region NewCommand-----------------
private void OnNewExcute(object item)
{
}
private bool CanNewExcute(object item)
{
return true;
}
#endregion
#region IPartImportsSatisfiedNotification -----------------
public void OnImportsSatisfied()
{
this.MenuService.AddMenuItem(this.NewCommand,selectedItem)
}
#endregion
}
код MenuService, как показано ниже:
[Export(typeof(IMenuService))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class MenuService:IMenuService
{
#region Constructor
public MenuService()
{
this.MenuItems = new ObservableCollection<IMenuItem>();
}
#endregion
#region IMenuService
public ObservableCollection<IMenuItem> MenuItems{ get; internal set; }
public void AddMenuItem(ICommand command,object commandParameter)
{
this.MenuItems.Add(new MenuItem() { Command = command, CommandParameter=commandParameter});
}
#endregion
}
Код MenuItem ниже:
public class MenuItem:DependencyObject, IMenuItem
{
public static readonly DependencyProperty CommandParameterProperty;
static MenuItem()
{
CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof(object), typeof(MenuItem), new PropertyMetadata(null));
}
public object CommandParameter
{
get { return (object)GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
public ICommand Command { get; set; }
}
Но при запуске код и SelectedItem были изменены.Параметр CommandParameter не изменяется.Если я intit seletedItem = "Тест".NewCommand получит параметр.но изменить SelectedItem.он все равно пройдет «Тест».это моя проблема.