2011-04-21 84 views
2

我是WPF的新手,我想将一个小的胜利形式的应用程序转换为WPF应用程序。WPF使用linq的combobx绑定

我使用LINQ-SQL和下面是dbml的文件

enter image description here 这是我有1个组合框和其他文本框

<ComboBox Height="23" IsDropDownOpen="False" Margin="107,52,281,0" Name="cbx_contact" VerticalAlignment="Top" /> 
    <Label Height="17" HorizontalAlignment="Left" Margin="25,55,0,0" VerticalAlignment="Top" Width="72">Contact :</Label> 
    <TextBox Height="23" Margin="107,85,281,0" Name="txt_name" VerticalAlignment="Top" /> 
    <Label Height="23" HorizontalAlignment="Left" Margin="25,89,0,0" Name="label2" VerticalAlignment="Top" Width="72">Name* :</Label> 
    <TextBox Height="23" Margin="107,118,281,0" Name="txt_cellno" VerticalAlignment="Top" /> 
    <Label Height="23" HorizontalAlignment="Left" Margin="25,121,0,0" Name="label3" VerticalAlignment="Top" Width="72">Cell No.* :</Label> 
    <TextBox Height="23" Margin="107,0,281,173" Name="txt_add1" VerticalAlignment="Bottom" /> 
    <Label Height="18.025" HorizontalAlignment="Left" Margin="25,0,0,176" Name="label4" VerticalAlignment="Bottom" Width="72">Address1 :</Label> 
    <TextBox Height="23" Margin="107,0,281,140" Name="txt_add2" VerticalAlignment="Bottom" /> 
    <Label Height="23" HorizontalAlignment="Left" Margin="25,0,0,138" Name="label5" VerticalAlignment="Bottom" Width="72">Address2 :</Label> 
    <TextBox Height="23" Margin="107,0,281,107" Name="txt_city" VerticalAlignment="Bottom" /> 

This is the design 我想结合我的XAML代码文件组合框到显示成员“名称”和值成员“联系ID”的联系人表

我尝试了不同的方法,但没有任何工作为m è...

这里是赋予错误

DataClasses1DataContext db = new DataClasses1DataContext(); 
     var sel = from contact in db.Contacts select new { contactid = contact.ContactID, name = contact.Name }; 

     cbx_contact.ItemsSource = sel; 
     cbx_contact.DisplayMemberPath = "name"; 
     cbx_contact.SelectedValuePath = "contactid"; 

我收到以下错误代码: 无法创建的“CONTACT_FORM”汇编定义的“WpfApplication2例如,版本= 1.0.0.0,文化=中立,PublicKeyToken = null'。异常是由调用的目标引发的。标记文件'WpfApplication2; component/Contact_form.xaml'第1行位置错误7.

请给我链接绑定wpf gridview的好例子。 ListView和组合框提前

+0

内部的异常会非常有用,因为它应该说明发生了什么。 – flq 2011-04-21 12:29:05

+0

谢谢@flq .. {“异常已被调用的目标引发。”}这是内部异常.. – 2011-04-21 12:31:12

回答

2

我不认为匿名类型是问题,因为this articlethis article表明你可以。

我认为你的xaml有一些语法问题。

要测试这我可能会做一些简单的中世纪测试,并首先删除设置Itemssource的代码,看看它是否运行,如果它不知道它肯定是你的xaml,如果是的话,那么它是在你的代码隐藏中。

我建议创建一个包含所需数据结构的对象,然后将窗口的datacontext设置为该对象,例如

public class ContactViewModel 
{ 
    public List<Contact> ContactList {get;set;} 
    public Contact SelectedContact {get;set;} 
} 
在窗口的构造函数

做到这一点:

this.DataContext = new ContactViewModel(); 

,然后你的XAML组合框可能仅仅是这样的:

<ComboBox ItemsSource="{Binding ContactList}" SelectedItem="{Binding SelectedContact}"/> 

如果ContactViewModel实现INotifyPropertyChanged的,你可以进一步修改您的XAML要做到这一点:

<Label>Contact:</Label> 
<TextBox Text="{Binding SelectedContact.Name}"/> 
<Label>Cell #:</Label> 
<TextBox Text="{Binding SelectedContact.CellNo}"/> 
<Label>Address 1:</Label> 
<TextBox Text="{Binding SelectedContact.Address1}"/> 
<Label>Address 2:</Label> 
<TextBox Text="{Binding SelectedContact.Address2}"/> 
+0

但linq已经在其designer.cs文件中创建了此类,为什么我需要重新创建它???公共部分类联系人:INotifyPropertyChanging,INotifyPropertyChanged – 2011-04-21 14:01:41

+0

这不是您再次创建它,而是您创建一个对象(视图模型)来与您的数据模型进行交互。 – Jose 2011-04-21 15:13:53

0

感谢匿名类型可能是问题,但它不应该是,而实际上结合,因为你是个大气压只有设置的ItemsSource。

在您的XAML:

<ComboBox ItemsSource="{Binding Path=.}" 
      DisplayMemberPath="name" 
      SelectedValuePath="contactid"/> 

在后面的代码:

cbx_contact.DataContext = sel; 

应该工作。