我在我的項目中使用Mahapps.Metro.Controls.DropDownButton
的UserControl
,我使用數據綁定填充該項目。爲了知道哪個項目被選中,我應用了一個項目模板,我在其中指定了項目點擊處理程序。有關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')
這告訴我在某些時候項目模板中TextBlock
的DataContext
被認爲是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);
}
}
}
放置一個斷點,在這裏我可以看到TextBlock
的DataContext
確實是一個Catalogue
和代碼按預期工作。
爲什麼會出現這種明顯的錯誤信息?我是否擔心它,這是否意味着我在代碼中犯了一些隱瞞的錯誤,還是應該滿足代碼的作用?我很抱歉,如果這是一個不相干或愚蠢的問題,但我只是學習WPF,我覺得它很具挑戰性,所以我試着瞭解即使我的代碼恰好工作,我周圍發生的事情。非常感謝您的見解。
謝謝。我不應該自己想,但當然是。 –