2016-10-02 2 views
2

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

ответ

1

Оскорбительная линия Content=" ". Вы устанавливаете содержимое элемента управления в строку " ", к которой элемент управления пытается применить шаблон. Поскольку класс string не имеет свойства Id, это приводит к ошибке привязки.

+0

Благодарим вас. Я не должен был это понимать сам по себе, но, конечно же, это было так. –

Смежные вопросы