Не могу связать ICommand в ВМ с кнопкой Command в xaml - PullRequest
0 голосов
/ 20 июля 2010

Я создаю виртуальную машину на основе легкого инструментария MVVM. В ВМ есть простой ICommand (RelayCommand)

  private RelayCommand _myCommand = null;
    public RelayCommand MyCommand
    {
        get
        {
            if (_myCommand == null)  //set break point here for debug
            {
                _myCommand = new RelayCommand(() =>
                {
                    try
                    {
                       //....
                    }
                    catch (Exception ex)
                    {
                        // notify user if there is any error
                        //....
                    }
                }
                , () => true);
            }
            return _myCommand;
        }
    }

затем в xaml просто привяжите это свойство Command к кнопке, подобной:

 <Button Grid.Column="1"  x:Name="Test" Content="Test" Margin="2,0,2,0" Command="{Binding Path=MyCommand}" />

Затем запустите приложение и нажмите на кнопку, ответа нет вообще. Нет ошибок. ВМ работает нормально. Данные были загружены в сетку данных до того, как я нажму кнопку «Тест».

Если отладить приложение и поставить точку останова, точка никогда не будет достигнута.

Как решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 21 июля 2010

Работает на моей машине:)

Серьезно, я сделал простой проект, создал ViewModel, вставил в ваш код, и это сработало.Я предполагаю, что вы имеете дело с другой проблемой.

Вот мой код C #.

Вот мой код XAML.

Время для евангелизации немного

Этот код ViewModel пахнет.Вы можете рассмотреть возможность использования какой-нибудь MVVM-инфраструктуры или помощников.Например, если вы посмотрите на ViewModelSupport , вы можете написать свою ViewModel так:

public class MyViewModel : ViewModelBase
{
    public void Execute_MyCommand()
    {
        // Your execution code here
    }
}

Затем вы избегаете всей этой грязной сантехники.Просто подумай:)

2 голосов
/ 20 июля 2010

Добавьте установщик к свойству MyCommand.

Как всегда, проверьте окно вывода на наличие ошибок привязки данных при визуализации XAML.

Кроме того, попробуйте добавить конвертер тестовых значений и поместить точку останова в метод convert, чтобы увидеть, выполняется ли привязка данных даже для этой команды. Если точка останова не достигнута, вы знаете, что у вас есть проблема в вашем XAML. Если достигнута точка останова, посмотрите на значение, чтобы убедиться, что контекст данных правильный.

<UserControl.Resources>
    <ResourceDictionary>
        <TestConverter x:Key="TestConverter" />
    </ResourceDictionary>
    <Button Grid.Column="1" x:Name="Test" Content="Test" Margin="2,0,2,0" Command="{Binding Path=MyCommand, Converter={StaticResource TestConverter}}" />
</UserControl>

Тестовый преобразователь значений - очень полезен для устранения проблем с привязкой данных.

public class TestConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine("TestConverter.Convert(value := {0}, targetType := {1}, parameter := {2}, culture := {3})",
            value, targetType, parameter, culture);
        return value; // put break point here to test data binding
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine("TestConverter.ConvertBack(value := {0}, targetType := {1}, parameter := {2}, culture := {3})",
            value, targetType, parameter, culture);
        return value;
    }
}
0 голосов
/ 28 июля 2010

1) Убедитесь, что вы возвращаете true от делегата CanExecute команды реле. (Я вижу, что вы делаете это, но хорошо бы перепроверить).

2) Кнопка внутри ListBox, DataGrid или DataForm?

Для ListBox или DataGrid:

В этом случае вам нужно изменить выражение привязки, чтобы оно ссылалось на VM DataContext, а не на элемент с привязкой к данным. См. Этот ответ .

Для DataForm:

Более хитрый, но посмотрите на этот вопрос.

0 голосов
/ 21 июля 2010

код выглядит нормально. так что вам просто нужно проверить окно вывода на наличие ошибок привязки данных. возможно, вы не установили правильный текст данных для представления. Кстати, вы должны добавить свою точку останова в try-catch команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...