Почему не изменяется CommandParameter? - PullRequest
0 голосов
/ 23 марта 2012

В моем 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.он все равно пройдет «Тест».это моя проблема.

...