2013-08-06 77 views
1

我已經經歷了大量的嘗試和論壇帖子,但我仍然無法解決我的問題。WPF組合框選中的項目錯誤 - 顯示「System.Data.Entity.DynamicProxies」

ISSUE 一個ComboBox從實體框架的DbContext不顯示所選擇的值,但沒有工作的項列表中顯示的數據。 選定的項目只是顯示

System.Data.Entity.DynamicProxies.Equipment_37EBC79AEAECCCCD132FD15F1C9172DF4DD402B322A9C5762AE640F03887F702

但組合框顯示正確的名單....

SETUP 我有一個包含一個名爲設備的類的dbcontext。 設備有兩個要顯示的項目 字符串標籤; Location.Name;

所選項目猛擊,列表適用

<ComboBox x:Name="cbxCopyTo" Grid.Row="2" Grid.Column="1" 
          IsEditable="True" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False" 
          ItemsSource="{Binding}"> 
        <ComboBox.SelectedValue> 
         <DataTemplate> 
          <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" > 
           <TextBlock.Text> 
            <MultiBinding StringFormat="{}{0} ({1})"> 
             <Binding Path="Tag" /> 
             <Binding Path="Location.Name" /> 
            </MultiBinding> 
           </TextBlock.Text> 
          </TextBlock> 
         </DataTemplate> 
        </ComboBox.SelectedValue> 
        <ComboBox.ItemTemplate> 
         <DataTemplate> 
          <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" > 
           <TextBlock.Text> 
            <MultiBinding StringFormat="{}{0} ({1})"> 
             <Binding Path="Tag" /> 
             <Binding Path="Location.Name" /> 
            </MultiBinding> 
           </TextBlock.Text> 
          </TextBlock> 
         </DataTemplate> 
        </ComboBox.ItemTemplate> 
       </ComboBox> 

你可以在上面看到我甚至試過明確設置選擇的值;但它不起作用。 我注意到當我嘗試使用轉換器時,它從來沒有被調用SelectedItem或SelectedValue時,我把轉換器在那裏。

下面的工作,如果我忽略位置(從數據源拖放獲得)。 這會正確顯示列表和選定的項目。

<Label Grid.Row="1" Grid.Column="0" Content="Copy From:" /> 
       <ComboBox x:Name="cbxCopyTo" Grid.Row="1" Grid.Column="1" 
          IsEditable="True" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False" 
          DisplayMemberPath="Tag" ItemsSource="{Binding}"> 
        <ComboBox.ItemsPanel> 
         <ItemsPanelTemplate> 
          <VirtualizingStackPanel/> 
         </ItemsPanelTemplate> 
        </ComboBox.ItemsPanel> 
       </ComboBox> 

請幫忙;我將不勝感激!

回答

1

解決 - 爲他人信息

好吧,我想出辦法,使級聯特性(如@Andy建議),但沒有在數據庫中出現。

通過使用代碼第一個註釋,您可以在EF模型上聲明一個屬性,該屬性不會映射到數據庫,但可以像任何數據庫屬性一樣查詢或綁定。這是在你的EF模型類的聲明做了,象下面這樣:

/// <summary> 
     /// Creates concatenation object that will not be mapped in the database but will be in the 
     /// Object Relational Mapping (ORM) of the EF model. 
     /// </summary> 
     [NotMapped] 
     public string TagAndLocation { get { return Tag + " (" + Location.Name + ")"; } } 

這就允許我使用簡單的結合「TagAndLocation」與下面的XAML:再次

 <ComboBox x:Name="cbxCopyTo" Grid.Row="2" Grid.Column="1" 
        IsEditable="True" IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False" 
        DisplayMemberPath="TagAndLocation" ItemsSource="{Binding}"> 
      <ComboBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel/> 
       </ItemsPanelTemplate> 
      </ComboBox.ItemsPanel> 
     </ComboBox> 

感謝@Andy和@aguedo valdes花時間提出建議。

1

你的兩個代碼示例之間的一個區別是在第二個代碼示例中,它將ComboBox.DisplayMemberPath設置爲某個東西。

我相信如果沒有設置,ComboBox只會在選定的項目上調用ToString()。這將解釋您在實際ComboBox中獲得的價值。

DisplayMemberPath只是一個字符串,期望一個綁定路徑,所以你不能給它一個多重綁定不幸的。我從來沒有使用過實體框架,但是可以重寫ToString()來獲取您返回的對象,或者添加一個包含所需值的屬性,然後將其用於DisplayMemberPath的值?

+0

謝謝@安迪,我感謝您的回答。這個選擇使用不同的成員是我倒退;但由於其他因素,我寧願數據庫不要有它。 也爲我的學習,因爲這只是我在這個綁定的東西上抓表面。 如果有人有另一種解決方案,我很樂意聽到它。 – Asvaldr

1

如果您正在使用實體框架代碼,請首先檢查模型中是否缺少一些虛擬屬性。喜歡的東西:

public class Equipment{ 
    .... 
    public virtual Location Location {get; set;} 
    .... 
} 
+0

感謝您的回答。我確實有。我完美地顯示在組合框下拉菜單中顯示的所有項目...只是不適用於所選項目..... – Asvaldr

+0

凹凸 - 任何人有任何想法? – Asvaldr