데이터 바인딩을 사용하여 채우는 프로젝트의 UserControl
에서 Mahapps.Metro.Controls.DropDownButton
을 사용하고 있습니다. 어떤 항목이 선택되는지 알기 위해 항목 클릭 핸들러를 지정하는 항목 템플리트를 적용합니다. 뷰 모델의 Catalogues
속성은 사용자 정의 KeyedCollection<string, Catalogue>
입니다ItemTemplate에서 WPF 바인딩이 작동하지만 오류 메시지가 발생합니다.
public CatalogueEditor()
{
InitializeComponent();
this.viewModel = new CatalogueEditorViewModel();
this.DataContext = this.viewModel;
}
: 관련 XAML은
<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
은 사용자 컨트롤에 대한 코드 숨김에서 생성자에 설정된 사용자 정의보기 모델입니다 INotifyCollectionChanged
을 구현합니다. 여기에는 비슷한 사용자 지정 KeyedCollection
개체가 INotifyCollectionChanged
을 구현하지만 더 이상 컬렉션이 아닌 항목 유형이 Question
인 항목이 포함되어 있습니다. Catalogue
개체는 읽기 전용 속성이 Id
이며 여기에 항목 템플릿에 TextBlock
을 바인딩합니다.
바인딩은 모든 권리를 작동하는 것 같다과 DropDownButton
는 Catalogues
컬렉션의 Catalogue
객체의 Id
라벨로 채워됩니다, 그러나 나는 바인딩 오류로 저를 알리는 출력을 얻을 :
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')
이 알려줍니다 어떤 점에서 아이템 템플릿에있는 TextBlock
의 DataContext
은 String
으로 인식되지만, ItemsSource
에 바인딩 된 컬렉션의 아이템으로는 Catalogue
이 될 예정입니다.
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);
}
}
}
내가 의도 한대로 TextBlock
의 DataContext
가 Catalogue
하고 코드가 실제로 작품이라고 볼 수 있습니다 여기에 브레이크 포인트를 배치 : 그것은뿐만 아니라이 개념뿐만 아니라 내 HandleDropDownItemMouseDown
이벤트 핸들러를 확증 올바른 작업입니다.
왜이 명백한 오류 메시지가 발생합니까? 걱정하지 않겠습니까? 내 코드에서 잠깐 잘못 들었음을 의미합니까? 아니면 코드가 작동한다는 내용이어야합니까? 이 사과가 부적절하거나 어리석은 질문 인 경우 사과드립니다. WPF를 배우는 중입니다. 코드가 제대로 작동하더라도 내 주변에서 일어나는 일을 이해하려고합니다. 당신의 통찰력은 매우 높이 평가됩니다.
감사합니다. 나는 혼자서 그것을 생각해서는 안되었지만 물론 그랬다. –