Не получается реализовать ICommand в MVVM

138
27 декабря 2019, 00:50

подскажите, что я сделал не правильно, у меня ICommand записано в раздел MVVM, но он не работает, если я ICommand переношу в раздел Model, то все работает, почему так никак понять не могу:

<Window x:Class="MultiplicProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MultiplicProject"
    xmlns:mvvm="clr-namespace:MultiplicProject.ViewModel"
    mc:Ignorable="d"
    Title="MainWindow" Height="200" Width="800">
<Window.DataContext>
    <mvvm:MainViewModel/>
</Window.DataContext>
<Grid DataContext="{Binding AllCountClass}">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <TextBox Text="{Binding A}" Width="100" Height="50" FontSize="45"/>
    <Label Content="x" Grid.Column="1" FontSize="45" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBox Text="{Binding B}" Width="100" Height="50" Grid.Column="2" FontSize="45"/>
    <Label Content="=" Grid.Column="3" FontSize="45" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBox Text="{Binding C}" Width="100" Height="50" Grid.Column="4" FontSize="45" />
    <Button Content="Click" Grid.Row="1" Grid.Column="2" Command="{Binding CountCommand}"/>
</Grid>

 public class CountClass : OnProperyChangedClass
{
    int a = 5;
    int b = 5;
    int c;
    public int A
    {
        get
        {
            return a;
        }
        set
        {
           a = value;
            OnAllPropertyChanged();
        }
    }
    public int B
    {
        get
        {
            return b;
        }
        set
        {
            b = value;
            OnAllPropertyChanged();
        }
    }
    public int C
    {
        get
        {
            return c;
        }
        set
        {
            c = value;
            OnAllPropertyChanged();
        }
    }
}

}

 public class MainViewModel : OnProperyChangedClass
{
    CountClass allCountClass = new CountClass();
    public CountClass AllCountClass
    {
        get
        {
            return allCountClass;
        }
        set
        {
            allCountClass = value;
            OnAllPropertyChanged();
        }
    }
    ICommand countCommand;
    public ICommand CountCommand
    {
        get
        {
            return countCommand ?? (countCommand = new RelayCommand(Multiply));
        }
    }
    private void Multiply(object obj)
    {
        allCountClass.C = allCountClass.B * allCountClass.C;
    }
}

}

 //Базовый класс с реализацией INPC
public class OnProperyChangedClass : INotifyPropertyChanged
{
    //Событие для извещения об изменении
    public event PropertyChangedEventHandler PropertyChanged;
    //Методы вызова события извещения об изменении свойства
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
        string[] names = prop.Split("\\/\r \n()\"\'-".ToArray(), StringSplitOptions.RemoveEmptyEntries);
        switch (names.Length)
        {
            case 0: break;
            case 1:
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
                break;
            default:
                OnPropertyChanged(names);
                break;
        }
    }
    ///Метод для вызова события извещения об изменении списка свойств
    ///Список имен свойств
    public void OnPropertyChanged(IEnumerable<string> propList)
    {
        foreach (string prop in propList.Where(name => !string.IsNullOrWhiteSpace(name)))
            OnPropertyChanged(prop);
    }
    ///Метод для вызова события извещения об изменении всех свойств
    ///name = propList Список свойств
    public void OnPropertyChanged(IEnumerable<PropertyInfo> propList)
    {
        foreach (PropertyInfo prop in propList)
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop.Name));
    }
    public void OnAllPropertyChanged()
    {
        OnPropertyChanged(GetType().GetProperties());
    }
    ///Методы Set для установки значения свойств
    ///Виртуальный метод изменения пля связанного со свойством значимого типа
    ///fieldProperty ссылка на поле значения свойства
    ///nameValue Новое значение 
    ///nameProperty Названи свойства
    public virtual void SetPropety<T>(ref T fieldProperty, T newValue, [CallerMemberName]string nameProperty = "") where T : IComparable<T>
    {
        if ((fieldProperty != null && fieldProperty.CompareTo(newValue) != 0 || (fieldProperty == null && newValue != null)))
        {
            fieldProperty = newValue;
            OnPropertyChanged(nameProperty);
        }
    }
    ///Виртуальный метод изменяющий значение поля связанного со свойством ссылочного типа
    ///fieldProperty ссылка на поле значения свойства
    ///nameValue Новое значение 
    ///nameProperty Названи свойства
    public virtual void SetProperty<T, U>(T fieldProperty, U newValue, [CallerMemberName]string nameProperty = "") where T : class where U : class, T
    {
        if (fieldProperty != newValue)
        {
            fieldProperty = newValue;
            OnPropertyChanged(nameProperty);
        }
    }
}

}

 public class RelayCommand : ICommand
{
    private Action<object> execute;
    private Func<object, bool> canExecute;
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        this.execute = execute;
        this.canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        return this.canExecute == null || this.canExecute(parameter);
    }
    public void Execute(object parameter)
    {
        this.execute(parameter);
    }
}

}

READ ALSO
Декодировать поток byte[] формата jBig2

Декодировать поток byte[] формата jBig2

Подскажите бесплатные библиотеки, для декодирования полученных из Pdf изображенийИспользую iTextSharp

158
Запись аудио-файла с микрофона в формате LPCM без WAV-заголовка на C#

Запись аудио-файла с микрофона в формате LPCM без WAV-заголовка на C#

Стоит задача записи аудио файла в формате LPCM (без WAV-заголовка)Подскажите, какой библиотекой можно воспользоваться для формирования аудио-файла...

126
Разные BsonClassMap для разных MongoClient

Разные BsonClassMap для разных MongoClient

Возможно ли создать два MongoClient с разной логикой сериализации? Например, нам необходимо писать один и тот же тип данных в разные коллекции...

131