2016-10-02 40 views
2

데이터 바인딩을 사용하여 채우는 프로젝트의 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을 바인딩합니다.

바인딩은 모든 권리를 작동하는 것 같다과 DropDownButtonCatalogues 컬렉션의 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')

이 알려줍니다 어떤 점에서 아이템 템플릿에있는 TextBlockDataContextString으로 인식되지만, 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); 
      } 
     } 
} 

내가 의도 한대로 TextBlockDataContextCatalogue하고 코드가 실제로 작품이라고 볼 수 있습니다 여기에 브레이크 포인트를 배치 : 그것은뿐만 아니라이 개념뿐만 아니라 내 HandleDropDownItemMouseDown 이벤트 핸들러를 확증 올바른 작업입니다.

왜이 명백한 오류 메시지가 발생합니까? 걱정하지 않겠습니까? 내 코드에서 잠깐 잘못 들었음을 의미합니까? 아니면 코드가 작동한다는 내용이어야합니까? 이 사과가 부적절하거나 어리석은 질문 인 경우 사과드립니다. WPF를 배우는 중입니다. 코드가 제대로 작동하더라도 내 주변에서 일어나는 일을 이해하려고합니다. 당신의 통찰력은 매우 높이 평가됩니다.

답변

1

잘못된 라인은 Content=" "입니다. 컨트롤의 내용을 " " 문자열로 설정하면 컨트롤에서 템플릿을 적용하려고 시도합니다. string 클래스에는 Id 속성이 없으므로 바인딩 오류가 발생합니다.

+0

감사합니다. 나는 혼자서 그것을 생각해서는 안되었지만 물론 그랬다. –