Combobox显示namespace.ViewModel

时间:2012-09-14 07:54:59

标签: c# wpf xaml data-binding

我有一个绑定到ObservableCollection<CustomerViewModel>

的组合框
<ComboBox ItemsSource="{Binding AllCustomers}" IsEditable="True"/>

如果我使用DisplayMemberPath属性,则下拉列表和selecteditem会正确显示

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

enter image description here

但如果分配了DataTemplate,则选择的项目无法正确显示

<ComboBox ItemsSource="{Binding AllCustomers}" SelectedValue="CustomerName" IsEditable="True">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding CustomerName}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ComboBox>

enter image description here

修改: 我找到了问题,但不是解决方案,问题是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;它会造成问题。

4 个答案:

答案 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)

如果要显示所选值的某些属性,则应使用SelectedValuePathSelectedValue将保留您要显示的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>