2013-11-04 56 views
1

這一直困惑了我一段時間。我有一個ComboBoxHierarchicalDataTemplate,在TreeView(...在一個用戶控制) - 事情的作品,我的意思是,我可以在數據庫中運行一個SELECT,看到正確的值被保存。底層價值是正確的,顯示值是ViewModelType.ToString()

問題是,當我從數據庫中加載的數據,並把它納入視圖(對不起,法語的語言環境):

combox shows ViewModelQualifiedTypeName.ToString() as a selected value

...但下拉列表中包含了所有的預期值,當我選擇一個正確顯示所選擇的值:

enter image description here

當我保存更改,再次,我知道我做了什麼右:

enter image description here

......但後來我重新加載數據的那一刻,一切都爲A-1,頂部形狀,完美......除了這個倔強的小組合框,保持顯示的完全限定型命名視圖模型的...

下面是錯誤的組合框的標記 - 老實說,我看沒有錯:

<ComboBox Style="{StaticResource StdDropdown}" 
      IsEditable="True" 
      TextSearch.TextPath="Value" 
      ItemsSource="{Binding SelectedOption.Values}" 
      SelectedItem="{Binding SelectedValue, Mode=TwoWay}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate DataType="viewModels:POptionValueViewModel"> 
      <Border Style="{StaticResource ListItemBorder}"> 
       <StackPanel Orientation="Horizontal"> 
        <Label Style="{StaticResource DropdownLabel}" 
          Content="{Binding Value}" /> 
       </StackPanel> 
      </Border> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

我需要知道這是怎麼可能的(並且,好了,如何修理它!)。我的意思是,它不是像整個列表顯示ViewModel.ToString()...


解決方案是結合SelectedValue而不是SelectedItem

<ComboBox Style="{StaticResource StdDropdown}" 
      IsEditable="True" 
      TextSearch.TextPath="Value" 
      ItemsSource="{Binding SelectedOption.Values}" 
      SelectedValue="{Binding SelectedValue, Mode=TwoWay}"> 

爲求完整性(如果它可以幫助理解爲什麼一個工作,但不是另一個) - 正在顯示的ViewModel:

/// <summary> 
/// Encapsulates a <see cref="IPOptionValue"/> implementation for presentation purposes. 
/// </summary> 
[ComVisible(false)] 
public class POptionValueViewModel : ViewModelBase<IPOptionValue> 
{ 
    public POptionValueViewModel(IPOptionValue entity) : base(entity) { } 

    public string OptionName { get { return Entity.POptionName; } } 

    /// <summary> 
    /// Gets a number representing the sorting order for the P-Option value. 
    /// </summary> 
    /// <value> 
    /// The sort order. 
    /// </value> 
    public int SortOrder { get { return Entity.SortOrder; } } 

    /// <summary> 
    /// Gets the P-Option value. 
    /// </summary> 
    /// <value> 
    /// The value. 
    /// </value> 
    public string Value { get { return Entity.Value.Trim(); } } 

    public override bool IsNew 
    { 
     get { return false; } 
    } 
} 

...和TreeView項的視圖模型屬性:

public POptionValueViewModel SelectedValue 
    { 
     get 
     { 
      var result = SelectedOption == null 
       ? null 
       : SelectedOption.Values.SingleOrDefault(e => e.Value == Entity.POptionValue.Trim()); 
      return result; 
     } 
     set 
     { 
      var selectedOption = _parentGroupOptions.SingleOrDefault(option => option.Name == value.OptionName); 
      if (selectedOption == null) return; 

      var selectedValue = selectedOption.Values.SingleOrDefault(option => option.Value.Trim() == value.Value.Trim()); 
      if (selectedValue == null) return; 

      Entity.POptionValue = selectedValue.Value.Trim(); 
      NotifyPropertyChanged(() => SelectedValue); 
     } 
    } 

回答

1

嘗試:

<DataTemplate DataType="{x:Type viewModels:POptionValueViewModel}"> 
    ...... 
</DataTemplate> 

編輯:的SelectedValue代替的SelectedItem

<ComboBox 
     SelectedValue="{Binding SelectedValue, Mode=TwoWay}"> 
     ... 
    </ComboBox> 
+0

良好的漁獲,但沒有運氣。它的行爲是一樣的:( –

+0

你確定這個班級名字是POptionValueViewModel ,有很大的O? –

+0

你能在你的虛擬機中顯示SelectedValue屬性嗎? –