這一直困惑了我一段時間。我有一個ComboBox
在HierarchicalDataTemplate
,在TreeView
(...在一個用戶控制) - 事情的作品,我的意思是,我可以在數據庫中運行一個SELECT
,看到正確的值被保存。底層價值是正確的,顯示值是ViewModelType.ToString()
問題是,當我從數據庫中加載的數據,並把它納入視圖(對不起,法語的語言環境):
...但下拉列表中包含了所有的預期值,當我選擇一個正確顯示所選擇的值:
當我保存更改,再次,我知道我做了什麼右:
......但後來我重新加載數據的那一刻,一切都爲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);
}
}
良好的漁獲,但沒有運氣。它的行爲是一樣的:( –
你確定這個班級名字是POptionValueViewModel ,有很大的O? –
你能在你的虛擬機中顯示SelectedValue屬性嗎? –