WPF中的combobox绑定到多值

playcity 2010-05-16 07:59:59
<ComboBox name="combobox_users" IsReadOnly="True" IsEditable="True"
DisplayMemberPath="username"
SelectedValue="{Binding userid}">
</ComboBox>

private void Window_Loaded(object sender, RoutedEventArgs e)
{


using(DBcontext c = new DBcontext())

{

this.combobox_users.ItemsSource = c.User.ToList();

}

}

目的是当选择了一个item后,将username,userid两个值同时更新到实体User中。

但是目前,selectedvalue只能绑定到一个userid值,能否让其再绑定到另一个属性,如username呢?当然用selectionchanged可以实现,但那样要多写一些代码。

如果用自定义控件实现此功能,那么在combobox中的selectionchanged中,应如何写更新依赖属性的代码呢?
...全文
1837 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
websco 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq124493482 的回复:]
有那功夫,selectionchanged中早干完了。
[/Quote]

这就见仁见智了,微软的 MVMM 模式中,Twoway 的 Data Binding 是核心思想,就像不直接从 TextBox.Text 取值,也不直接对 TextBox.Text 进行数据验证一样,能使用得上 Data Binding 的地方,就基本上不会再去从界面上取值了。

不过对于 ComboBox ,加上了 SelectedValue依赖项属性 和 SelectedValuePath 属性 之后,基本上就够用了,楼主的需求,我觉得是非常个别的情况。

题外话: 既然楼主的 userid 和 username 是一一对应的关系,何不在 User 模型中进行这种处理呢?当 userid 发生变化时,自动获得 username 的值,通过ComboBox的ItemsSource能够实现这个取值操作。
websco 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 playcity 的回复:]
取itemssource是可以得到实体的,但是并不能用xaml进行界面上的绑定,所以,其复用性也是非常差的。[/Quote]
我说的是在 User 的 class 定义中,由class自己负责对 UserName 属性的 getter ,这种复用性应是最高的,如果封装得好的话。形如:

public string UserName
{
get{ return XXXXX.GetUserNameById(this.userid); }
}

至于绑定,我认为仅绑定一个 UserId 就足够了,除非 UserId和UserName不是一对一的关系~
playcity 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq124493482 的回复:]
<ComboBox name="combobox_users" IsReadOnly="True" IsEditable="True"
DisplayMemberPath="username"
SelectedItem="{Binding MyUser}">
</ComboBox>
------------------------------------------------……
[/Quote]
SelectedItem="{Binding MyUser}"
这句不用,默认也是绑定到实体的,兄台反倒多此一举了。
playcity 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 websco 的回复:]
这就见仁见智了,微软的 MVMM 模式中,Twoway 的 Data Binding 是核心思想,就像不直接从 TextBox.Text 取值,也不直接对 TextBox.Text 进行数据验证一样,能使用得上 Data Binding 的地方,就基本上不会再去从界面上取值了。

不过对于 ComboBox ,加上了 SelectedValue依赖项属性 和 SelectedValuePath 属性 之后,基本上就够用了,楼主的需求,我觉得是非常个别的情况。

题外话: 既然楼主的 userid 和 username 是一一对应的关系,何不在 User 模型中进行这种处理呢?当 userid 发生变化时,自动获得 username 的值,通过ComboBox的ItemsSource能够实现这个取值操作。[/Quote]
取itemssource是可以得到实体的,但是并不能用xaml进行界面上的绑定,所以,其复用性也是非常差的。
playcity 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 websco 的回复:]
引用 9 楼 qq124493482 的回复:
有那功夫,selectionchanged中早干完了。
[/Quote]
如果这个东西只用于一处,当然可以在selectionchanged中可以做得到。但是,我的目的是“复用”,它将用于程序的各个角落,所以那并不是一个好的办法。
sy527205079 2010-05-21
  • 打赏
  • 举报
回复
关注下
qq124493482 2010-05-21
  • 打赏
  • 举报
回复
楼上兄弟的意思我听明白了。
4.0也只能解决一个属性的问题呀。
要是两个三个四个,也是没辙,只能如楼上兄弟所说,自己加SelectedValue依赖项属性 和 SelectedValuePath 属性,有那功夫,selectionchanged中早干完了。
websco 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq124493482 的回复:]
<ComboBox name="combobox_users" IsReadOnly="True" IsEditable="True"
DisplayMemberPath="username"
SelectedItem="{Binding MyUser}">
</ComboBox>
------------------------------------------------……
[/Quote]

有一种更常见的情况不知7楼考虑过没有,ComboBox.ItemsSource 往往和 ComboBox.DataContext 并不是相同的类型, 比如
ComboBox.ItemsSource = new ObservableCollection< User >();
ComboBox.DataContext = Employee的一个实例;
其中,Employee 的一个属性为 UserId ,和 User 类型中的 UserId 对应。

在 Silverlight 3.0 中,就是因为这种情况大量的客观存在,才会导致 ComboBox 在 Silverlight 3.0中成了鸡肋,直至 Silverlight 4.0 中加上了 SelectedValue依赖项属性 和 SelectedValuePath 属性。
qq124493482 2010-05-19
  • 打赏
  • 举报
回复
<ComboBox name="combobox_users" IsReadOnly="True" IsEditable="True"
DisplayMemberPath="username"
SelectedItem="{Binding MyUser}">
</ComboBox>
--------------------------------------------------------
选择之后,会把User整个赋值给你的以User类为类型的MyUser属性,自然你的MyUser中的username,
userid都会变的。
因为你的ComboBox的ItemsSource是一个User的列表嘛,所以每一行就是一个User实体类的实例。
websco 2010-05-17
  • 打赏
  • 举报
回复
要获取两个或以上的绑定值,只能从 SelectedItem 中去取值,本身 SelectedValue 也只是根据 SelectedValuePath 从 SelectedItem 去取值,只是一个捷径而已 ---- 至少在Silverlight 4.0中是这样,WPF是不是这样我只是猜测。
websco 2010-05-17
  • 打赏
  • 举报
回复
正常思路应是定义一个 XXXPath 属性 和一个 SelectedXXX 依赖赖属性,
就像 SelectedValuePath 属性 和 SelectedValue 依赖赖属性 一样。

只定义一个 SelectedXXX 依赖赖属性,你怎么知道要将 SelectedItem 中的哪一个属性的值赋值至 SelectedXXX 呢?
playcity 2010-05-17
  • 打赏
  • 举报
回复
谢楼上,没有那么复杂吧,只是定义一个依赖属性就可以了,只是我不知道在selectionchanged事件中,怎么给这个定义的依赖属性赋值。
websco 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 playcity 的回复:]
谢谢楼上回答,我正是想要自定义控件增加新绑定属性,请问代码如何写呢?
[/Quote]

这种代码我能想到的就只有使用 Reflection 了, 即通过 XXXXPath 所对应的属性名称,从 SelectedItem 中通过反射取得值。
playcity 2010-05-17
  • 打赏
  • 举报
回复
谢谢楼上回答,我正是想要自定义控件增加新绑定属性,请问代码如何写呢?
jv9 2010-05-17
  • 打赏
  • 举报
回复
绑定后,是通过SelectedValue或者SelectedItem进行取值,绑定数据源并没有改变,前台显示是DisplayMemberPath进行设置。

绑定后,取值可以通过SelectedIndex进行对比取值,例如你的例子,userid不同,可以通过对比取值。

另外,你也可以对Tag进行绑定,或者自定义控件增加新绑定属性。

8,731

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧