使用匿名类型列表填充AutoCompleteBox

时间:2011-11-21 12:58:27

标签: c# wcf linq autocomplete anonymous-types

我正在为我的WPF C#项目选择userControl。 我确实为选择创建了一个自定义自动完成控件,但出于优化目的,我现在正在研究使用WPF Toolkit中的AutoComplete文本框。

由于我在数据库中有成千上万的用户,我不想使用自定义类或在我检索的列表上的许多foreach。所以记住这是我的问题。

var list = from cu in conn3.customer_users
select new  {
              username    =  cu.username,
             name        =  cu.fname.TrimEnd() + " " + cu.lname.TrimEnd()
                 // This would of course be built with more info from more entities. 

             };

            this.autoComplete.ItemsSource = list.ToList();

现在问题在于它为结果框输出以下格式(在搜索中)。

{username = DEI1231,name = Missy Anderson}

所以我不想要预先列出这个列表,而是将其格式化为我绑定它或者我列出的列表。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您最终选择必须是字符串而不是匿名类型

 var str = from cu in x
           // your stuff
           select cu.username + cu.fname;

另一种选择是保留匿名类型并在绑定中使用StringFormat

<TextBlock >
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}  {1}">
            <Binding ElementName="username" Path="Text"/>
            <Binding ElementName="name" Path="Text"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

另一种选择是让匿名类型的字段具有您想要显示的完整字符串,并使用 DisplayMemberPath 进行绑定

答案 1 :(得分:-1)

我不想用开头的空间来解决更多问题,最后做了一个只允许初始空间的决定,最后无论如何都要从Meta字符串中删除所有空格。

实际上问题实际上是在它自己的情况下,所以这是通过解决方案的存在。我没有进一步研究这个问题,因为转而使用标签内部的meta代替实际消息。并带有前缀。例如。 @meta 让我们看看它是如何工作的;)

 private string metaInput { get; set; }
    public string MetaInput 
    {
        get
        {
            return metaInput;
        }

        set 
        {
            string x = value;
            if (x.Length > 3)
            {
                if (x.EndsWith(" "))
                {

                string z = x.Replace(" ", "");
                x = z.Replace(",", "");
                int l = x.Length;

                    if (l > 2)
                    {
                        metaInput = null;
                        SaveMetaWord(x);
                    }

                    else 
                    {
                        metaInput = null;
                    }
                }

            }

            else 
            {
                metaInput = value;
            }

        }
    }