2

我有一个绑定到的组合框ObservableCollection<CustomerViewModel>

<ComboBox ItemsSource="{Binding AllCustomers}" IsEditable="True"/>

如果我使用 DisplayMemberPath 属性,下拉列表和选定项会正确显示

<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="True" 它会产生问题。


代码摘要:

public class AllCustomersViewModel
{
   public ObservableCollection<CustomerViewModel> AllCustomers {get; set;}
}

public class CustomerViewModel
{
   public string CustomerName;
   public short CustomerID;
}

要设置(或如何)哪个属性以正确显示选定的值/项目。

非常感谢您提前。



实际代码

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="True" 它会产生问题。

4

4 回答 4

3

当没有可用的模板时,将显示对象类型的全名。完整的类型名称也是ToString()方法调用的结果。所以要么覆盖ToString()方法,要么调查更多关于数据模板的信息。

于 2012-09-14T08:42:30.140 回答
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>
于 2012-09-14T08:54:54.297 回答
0

尝试

<ComboBox ItemsSource="{Binding AllCustomers}" SelectedValue="CustomerName">
        <ItemsControl.ItemTemplate>
             <DataTemplate>
                 <TextBlock Text="{Binding Item.CustomerName}"/>
             </DataTemplate>
        </ItemsControl.ItemTemplate>
</ComboBox>
于 2012-09-14T08:26:51.110 回答
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>
于 2017-10-26T09:42:19.257 回答