2014-06-25 75 views
3

當我在WPF ListBox中同時使用ItemsSourceItemTemplate時,我很困惑如何解決綁定問題。我有一個ObservableCollection<int>ListOfIndexes。對於每個索引,我想在數據庫表中查找它的記錄。我希望在IndexToObjectDescriptionConverter這樣做。使用ItemsSource和ItemTemplate的WPF列表框

<ListBox ItemsSource="{Binding ListOfIndexes}" 
     ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" /> 

但在轉換器中的斷點告訴我,值由ItemTemplate結合閱讀是窗口本身—即ItemsSourceItemsTemplateDataContext是一樣的。

赦免了一點坦率,但這似乎是DUMB。 ItemTemplate的整個點是呈現ItemsSource內的每個元素,所以我想我認爲ItemTemplateDataContext將是正在呈現的單個元素。

所以說,我該如何告訴ItemTemplate它應該擔心由ItemsSource代表的各個元素,而不是使用整個窗口的DataContext

回答

6

您需要爲ItemTemplate使用數據模板。這是然後應用到每個項目列表中的

MSDN文檔是在這裏: http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplate(v=vs.110).aspx

問題她是關於數據的上下文範圍。當你綁定ListBox上的任何屬性時,它將使用ListBox的數據上下文 - 因此數據上下文爲什麼會被傳遞給轉換器。如果您在ItemTemplate中設置了一個數據模板,它將會將該模板應用於列表中的每個項目。我猜根據您提供您需要有數據模板中的轉換器的簡單代碼:

<ListBox ItemsSource="{Binding ListOfIndexes}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

在這種情況下,ContentControl中會被渲染爲每個項目,與該項目,因爲它的數據上下文。

+1

完美。我想我沒有意識到'ItemTemplate'中的'DataTemplate'正確地標識了數據上下文,而只是使用'ItemTemplate'來定義綁定就使用了控件的作用域。謝謝! – Tenner

1

首先,我建議您在MSDN中閱讀Data Templating Overview頁面,以便您更好地理解此數據綁定過程。

我想在數據庫表中查找它的記錄。我希望在IndexToObjectDescriptionConverter中做到這一點。

這是您的第一個錯誤。 IValueConverter負責轉換數據綁定值,而不是訪問數據庫。在您的視圖模型中訪問您的數據並使用結果填充公共屬性。然後數據將這些屬性綁定到XAML中的UI控件。

赦免有點坦誠的,但這似乎啞

只有那些不瞭解情況。

如何告訴ItemTemplate它應該擔心由ItemsSource表示的各個元素而不使用整個窗口的DataContext?

你不告訴它什麼...簡單地定義正確的XAML是不夠的:

Resources

<DataTemplate x:Key="SomeDataTemplate"> 
    <!-- The DataContext here is set to an item from the data bound collection --> 
</DataTemplate> 

在XAML:

<ListBox ItemsSource="{Binding ListOfIndexes}" 
    ItemTemplate="{StaticResource SomeDataTemplate}" /> 

這它。

相關問題