2015-03-25 39 views
2

WPF: How to bind to only one item in a collection, not using ItemsControl since I don't want to display all of them類似,但集合與主綁定項目相關。所有數據都通過EntityFramework進入。與鏈接的問題,XAML最能解釋它:綁定到相關(明細)集合中第一項的屬性

<StackPanel Grid.Row="1" Orientation="Horizontal" DataContext="{Binding CurrentCustomer}"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Total Orders:" /> 
    <TextBlock Text="{Binding Orders.Count}" /> 
    </StackPanel > 

    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="First Order:" /> 
    <TextBlock Text="{Binding Orders.First.OrderDate}" /> 
    </StackPanel > 
</StackPanel> 

正如你所看到的,我猜,因爲我能得到使用「Orders.Count」的相關訂單的數量,我試圖使用相同linq語法嘗試檢索Orders.First(我也試過Orders.FirstOrDefault),但這不起作用。

查看鏈接的問題,我嘗試了Sheridan的'[]'語法,但Orders [0] .OrderDate給出的輸出錯誤爲:System.Windows.Data Error: 40 : BindingExpression path error: '[]' property not found on 'object' ''HashSet'1' (HashCode=37425772)'. BindingExpression:Path=Orders[0].OrderDate; DataItem='Customer_<BigLongIdentityString>' (HashCode=21972018); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')。看着他鏈接到的msdn文章,我試着用方括號(根據附加屬性)和使用斜槓(至於何時源是集合)包裝表達式。並不意外,這些也失敗了。

有人可以告訴我我是如何到相關集合中的第一個項目的財產?

+0

首先是擴展方法,即'Orders.First()。OrderDate'? – StuartLC 2015-03-25 04:48:16

+0

@StuartLC好主意,但沒有。同樣的錯誤信息:'BindingExpression路徑錯誤:''''''上沒有找到'First()'屬性 – mcalex 2015-03-25 04:57:23

+0

@LynnCrumbling我沒有看到那一個。我不知道如何將HashSet更改爲集合,因爲它是所有EF魔術(我一般都堅持ObservableCollection),但是這個答案加上你的第一個評論看起來像是我的問題的答案:在VM中創建一個屬性具有來自HashSet的最早日期的訂單。你想回答你的意見,我會接受嗎? – mcalex 2015-03-25 05:05:06

回答

2

如果可能的話,你可以在新的屬性總是添加到模型中暴露的第一個項目:

public Order FirstItem 
{ 
    get { return this.Orders.First(); } 
} 

然後,你可以綁定到新的屬性。另外,this answer is highly relevant。在這裏,哈希集可能不太合適。沒有索引器。我通常堅持ObservableCollections。

此外,關於與數據綁定兼容的EF代,請參閱this MSDN article。閱讀稱爲

Updating code generation for data binding

你可以亂用T4模板,並按照文章的部分,

Find and replace the first occurrence of 「HashSet」 with 「ObservableCollection」.

快樂WPF'ing。

相關問題