我有一个绑定到ObservableCollection<CustomerViewModel>
<ComboBox ItemsSource="{Binding AllCustomers}" IsEditable="True"/>
如果我使用DisplayMemberPath属性,则下拉列表和selecteditem会正确显示
<ComboBox ItemsSource="{Binding AllCustomers}" DisplayMemberPath="CustomerName" IsEditable="True"/>
但如果分配了DataTemplate,则选择的项目无法正确显示
<ComboBox ItemsSource="{Binding AllCustomers}" SelectedValue="CustomerName" IsEditable="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding CustomerName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ComboBox>
修改: 我找到了问题,但不是解决方案,问题是ComboBox是否具有IsEditable =&#34; True&#34;它会造成问题。
代码摘要:
public class AllCustomersViewModel
{
public ObservableCollection<CustomerViewModel> AllCustomers {get; set;}
}
public class CustomerViewModel
{
public string CustomerName;
public short CustomerID;
}
要设置(或如何)正确显示selectedvalue / item的属性。
非常感谢你。
ActualCode
public class AccountTransactionsViewModel
{
DataRepository _repository;
public AccountTransactionsViewModel()
{
_repository = new DataRepository();
CreateAccountsViewModel();
}
public ObservableCollection<AccountViewModel> AllAccounts { get; set; }
void CreateAccountsViewModel()
{
List<AccountViewModel> allAccounts = _repository.GetAccounts()
.Select(a => new AccountViewModel(a, _repository))
.ToList();
AllAccounts = new ObservableCollection<AccountViewModel>(allAccounts);
}
}
public class AccountViewModel
{
Account _account;
DataRepository _repository;
public AccountViewModel(Account account, DataRepository repository)
{
_account = account;
_repository = repository;
}
public short AccountID { get { return _account.AccountID; } set { } }
public string AccountName { get { return _account.AccountName; } set { } }
}
XAML:
<ComboBox Name="customerCombobox" ItemsSource="{Binding AllAccounts}" IsEditable="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding AccountName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ComboBox>
修改
我找到了问题,但没有找到解决方案,问题是ComboBox是否具有IsEditable =&#34; True&#34;它会造成问题。
答案 0 :(得分:3)
当没有可用的模板时,将显示对象类型的全名。完整类型名称也是ToString()
方法调用的结果。因此,请覆盖ToString()
方法或调查有关数据模板的更多信息。
答案 1 :(得分:0)
尝试
<ComboBox ItemsSource="{Binding AllCustomers}" SelectedValue="CustomerName">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Item.CustomerName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ComboBox>
答案 2 :(得分:0)
如果要显示所选值的某些属性,则应使用SelectedValuePath
。
SelectedValue
将保留您要显示的SelectedItems
属性的值。
如果没有设置SelectedValuePath
,框架会尝试返回整个SelectedItem
- 在这种情况下AccountViewModel
实例 - 转换为字符串
<ComboBox Name="customerCombobox" ItemsSource="{Binding AllAccounts}" SelectedValuePath="AccountName">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding AccountName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ComboBox>
答案 3 :(得分:0)
我遇到了同样的问题,因为我想在组合框项目中显示自定义文本。
当您有ItemTemplate
时,如果没有实现DisplayMemberPath
功能,则无法设置ComboBox的toString()
显示类名。
您只需使用TextSearch.TextPath
即可解决问题。
<ComboBox IsEditable="True" TextSearch.TextPath="MySelectedTextField">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock ToolTip="{Binding MyTooltipField}">
<Run Text="{Binding MyCustomField1}" />
<Run Text=" - "/>
<Run Text="{Binding MyCustomField2}" />
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>