2016-07-14 4 views
0

У меня есть окно с Grid:MENUITEM команда связывания с ViewModel в UserControl находится в окне

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="0.5*" /> 
     <RowDefinition Height="40" /> 
     <RowDefinition Height="15*" /> 
     <RowDefinition Height="0.3*" /> 
    </Grid.RowDefinitions> 

    <central:CentralView Grid.Row="2" ItemsSource="{Binding MainWindowModels}" /> 

</Grid> 

CentralView является UserControl с DataGrid и DataGrid ContextMenu. Кроме того, у меня есть простой класс ведьму реализует интерфейс ICommand и статический класс команд, где хранятся все команды:

static CentralViewBaseCommands _goToEti; 
public static CentralViewBaseCommands GoToEti => _goToEti ?? new 

    CentralViewBaseCommands(GoToExternalWindow); 
    private static void GoToExternalWindow(object obj) 
    { 
     if (obj is GridContextMenuInfo) 
     { 
      object record = (obj as GridRecordContextMenuInfo)?.Record; 
      CentralDataGridModel mwSfDgModel = (CentralDataGridModel)record; 

      if (mwSfDgModel != null) 
      { 
       //TODO 
      } 
     } 
    } 

CentralViewBaseCommands:

public class CentralViewBaseCommands : ICommand 
{ 
    private Action<object> _execute; 
    private Predicate<object> _canExecute; 

    public CentralViewBaseCommands(Action<object> execute) : this(execute, null) 
    { 
     _execute = execute; 
    } 

    public CentralViewBaseCommands(Action<object> execute,Predicate<object> canExecute) 
    { 
     if (execute == null) 
     throw new ArgumentNullException(nameof(execute)); 
    _execute = execute; 
    _canExecute = canExecute; 
} 
public bool CanExecute(object parameter) 
{ 
    return _canExecute?.Invoke(parameter) ?? true; 
} 

public void Execute(object parameter) 
{ 
    _execute(parameter); 
} 
    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 
} 

Кодекс MenuItem является следующее (который находится в UserControl):

<MenuItem Header="Исправление ошибок"> 
    <MenuItem Command="{Binding Source={x:Static Member=command:CentralViewCommands.GoToEti}}" 
       CommandParameter="{Binding}" 
       Header="Удаление ошибочно внесенной техники"> 
     <MenuItem.Icon> 
      <Viewbox> 
       <Grid> 
        <Grid Width="32" 
          Height="32" 
          Visibility="Collapsed" /> 
        <Path Width="26" 
          Height="26" 
          Margin="0,0,0,0" 

          Fill="#FFFF0000" 
          RenderTransformOrigin="0.5,0.5" 
          Stretch="Uniform"> 
         <Path.RenderTransform> 
          <TransformGroup> 
           <TransformGroup.Children> 
            <RotateTransform Angle="0" /> 
            <ScaleTransform ScaleX="1" ScaleY="1" /> 
           </TransformGroup.Children> 
          </TransformGroup> 
         </Path.RenderTransform> 
        </Path> 
       </Grid> 
      </Viewbox> 
     </MenuItem.Icon> 
    </MenuItem> 
</MenuItem> 

Итак, проблема в следующем. Когда я нажимаю на команду пункта меню, выполненную, как я ожидаю, но если я связываю команду для команды в UserControlViewModel (DelegateCommand<>) Command="{Binding CommandInViewModel}", ничего не происходит и команда не выполняется. Может кто-нибудь объяснить мне почему?

ответ

1

Я думаю, это потому, что эта линия:

public static CentralViewBaseCommands GoToEti => _goToEti ?? new CentralViewBaseCommands(GoToExternalWindow); 

всегда генерирует новый экземпляр CentralViewBaseCommands.

Попробуйте вместо этого:

public static CentralViewBaseCommands GoToEti { get; } = new CentralViewBaseCommands(GoToExternalWindow); 

И удалить _goToEti.

Надеюсь, это поможет!

+0

Ваша исправленная версия должна удалить '{get; } '; которые не будут компилироваться. –

+0

Благодарим вас за ответ. Это правда, но я хочу использовать команду в классе ViewModel (DataContext of CentralView). Пример: private DelegateCommand _goToEti и использование в классе ViewModel. Но, в классе ViewModel эта команда не выполнена – Valery

+0

Какую версию Visual Studio вы используете, что {get; } не будет компилироваться? http://geekswithblogs.net/WinAZ/archive/2015/06/30/whatrsquos-new-in-c-6.0-auto-property-initializers.aspx –

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