Команды привязки в wpf

#wpf #xaml #mvvm #data-binding

#wpf #xaml #mvvm #привязка данных

Вопрос:

У меня есть проект WPF, который реализует шаблон проектирования MVVM.

Это мой xaml-код в файле Home.xaml:

 <DataTemplate>
    <myProject:ImageButton Content="{Binding Name}" Tag="{Binding MyPath}" Command="{Binding Path=MyCommand}">                                
    </myProject:ImageButton>
</DataTemplate>
  

У меня есть класс, который выглядит следующим образом:

 public class MyClassDto
{
    public string Name { get; set; }

    public string ShortName { get; set; }

    public string MyPath { get; set; }

    public ICommand MyCommand
    {
        get { return new NavigateToViewCommand(Container.Container.GetA<IMyViewModel>()); }
    }
}
  

У меня также есть файл HomeViewModel, который выглядит следующим образом:

 public class HomeViewModel : ViewModelBase, ILandingViewModel
{
    public HomeViewModel()
    {
        items = new List<MyClassDto>
        {
            new MyClassDto
            {
                Name = "John",
                Path = "1.png"
            },
            new MyClassDto
            {
                Name = "Jack",
                Path = "2.png"
            }
        };

    }

    public IList<MyClassDto> items { get; set; }
}
  

Куда мне нужно поместить метод MyCommand?

На данный момент я вижу это в моем окне Debug-> Output:

 System.Windows.Data Error: 40 : BindingExpression path error: 'MyCommand' property not found on 'object' ''MyClassDto' (HashCode=25729862)'.
  

Выражение привязки:Path=MyCommand; DataItem=’MyClassDto’ (хэш-код=25729862); целевой элемент — ‘ImageButton’ (Name=»); целевое свойство
является ли ‘Command’ (тип ‘ICommand’)

Комментарии:

1. В том виде, в каком это имеет место сейчас в MyClassDto классе, а не в методе, но ICommand или во всем, что реализует ICommand свойство

2. Пуристы MVVM сказали бы, что вы должны поместить свойство type CommandViewModel в свой класс ViewModel MyClassDto и использовать конвертер в Binding , который преобразует CommandViewModel в ICommand . Это потому, что вы не должны использовать специфические для WPF типы данных (например ICommand ) в ViewModel, по крайней мере, не с точки зрения пуриста.

3. @dkozl Это не работает. Пожалуйста, посмотрите вопрос еще раз, я обновил класс MyClassDto.

4. Когда вы говорите, что это не работает, вы имеете в виду, что это все еще выдает ошибку выражения привязки или просто команда не запускается?

5. Команда @dkozl не запускается. Предупреждение в окне вывода больше не отображается.

Ответ №1:

У вас должно быть свойство MyCommand типа ICommand в вашем классе MyClassDto

Комментарии:

1. Это не работает. Пожалуйста, посмотрите вопрос еще раз, я обновил класс MyClassDto.

Ответ №2:

Работает ли это предложение?

 new MyClassDto
{
    LanguageName = "Jack",
    Path = "2.png"
}
  

Вероятно, у вас где-то есть другой класс MyClassDto с именем языка и путем без MyCommand.

Комментарии:

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