Я использую Mahapps.Metro.Controls.DropDownButton
в UserControl
в моем проекте, который я заполняю с использованием привязки данных. Чтобы узнать, какой элемент выбран, я применяю шаблон элемента, в котором я указываю обработчик элемента. Соответствующий XAML являетсяWPF-привязка в ItemTemplate работает, но создает сообщения об ошибках
<Controls:DropDownButton
x:Name="selector"
VerticalContentAlignment="Center"
Content=" "
Background="Transparent"
BorderThickness="0"
ItemsSource="{Binding Catalogues}"
>
<Controls:DropDownButton.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Id}" MouseDown="HandleDropDownItemMouseDown" />
</DataTemplate>
</Controls:DropDownButton.ItemTemplate>
</Controls:DropDownButton>
DataContext
модель настраиваемого представления устанавливается в конструкторе в коде-позади для пользовательского элемента управления:
public CatalogueEditor()
{
InitializeComponent();
this.viewModel = new CatalogueEditorViewModel();
this.DataContext = this.viewModel;
}
Catalogues
свойства в модели представления является обычаем KeyedCollection<string, Catalogue>
который реализует INotifyCollectionChanged
. Это содержит элементы, которые аналогичны обычным KeyedCollection
объектам, реализующим INotifyCollectionChanged
, но с типом товара Question
, который больше не является коллекцией. Объекты Catalogue
имеют свойство только для чтения Id
, к которому я привязываю TextBlock
в шаблоне элемента.
Связывание, кажется, работает все права и DropDownButton
получает заполняется Id
этикетками Catalogue
объектов в Catalogues
коллекции, но я получаю выход информирование мне ошибки связывания:
System.Windows.Data Error: 40 : BindingExpression path error: 'Id' property not found on 'object' ''String' (HashCode=-842352768)'. BindingExpression:Path=Id; DataItem='String' (HashCode=-842352768); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Это говорит что в какой-то момент DataContext
из TextBlock
в шаблоне позиции воспринимается как String
, хотя я предполагаю, что он будет Catalogue
как элемент в коллекции, связанный с ItemsSource
. Это не только правильная работа, которая подкрепляет это понятие, но и мой обработчик события HandleDropDownItemMouseDown
:
void HandleDropDownItemMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left && selector.IsExpanded) {
Catalogue catalogue = ((TextBlock)e.Source).DataContext as Catalogue;
if (catalogue != null) {
viewModel.Select(catalogue);
}
}
}
Размещение контрольной точки здесь я могу видеть, что DataContext
из TextBlock
действительно Catalogue
и код работает как задумано.
Зачем возникает это очевидное сообщение об ошибке? Должен ли я беспокоиться об этом, означает ли это, что я совершил какую-то коварную ошибку в своем коде, или я буду доволен, что код работает? Приносим извинения, если это неуместный или глупый вопрос, но я просто изучаю WPF, и я считаю это довольно сложным, поэтому я стараюсь понять, что происходит вокруг меня, даже если мой код работает. Ваше понимание очень ценится.
Благодарим вас. Я не должен был это понимать сам по себе, но, конечно же, это было так. –