#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
в свой класс ViewModelMyClassDto
и использовать конвертер в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, но вы говорите, что это назначение работает, поэтому я сомневаюсь, что существует другой класс с таким же именем.