2016-10-02 79 views
2

我在我的項目中使用Mahapps.Metro.Controls.DropDownButtonUserControl,我使用數據綁定填充該項目。爲了知道哪個項目被選中,我應用了一個項目模板,我在其中指定了項目點擊處理程序。有關XAML是在ItemTemplate中的WPF綁定工作,但產生錯誤消息

<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獲取與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')

這告訴我在某些時候項目模板中TextBlockDataContext被認爲是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); 
      } 
     } 
} 

放置一個斷點,在這裏我可以看到TextBlockDataContext確實是一個Catalogue和代碼按預期工作。

爲什麼會出現這種明顯的錯誤信息?我是否擔心它,這是否意味着我在代碼中犯了一些隱瞞的錯誤,還是應該滿足代碼的作用?我很抱歉,如果這是一個不相干或愚蠢的問題,但我只是學習WPF,我覺得它很具挑戰性,所以我試着瞭解即使我的代碼恰好工作,我周圍發生的事情。非常感謝您的見解。

回答

1

違規行是Content=" "。您正在將控件的內容設置爲" "字符串,控件將嘗試應用您的模板。由於string類沒有Id屬性,因此會導致綁定錯誤。

+0

謝謝。我不應該自己想,但當然是。 –