WPF 集合类型绑定的问题

zmidl 2017-03-18 12:40:35
首先建了一个UserControl控件MyControl 有6个TextBlock 然后定义一个IEnumerable类型的依赖属性 Source来接受一个集合数据源。然后 每个TestBlock分别绑定这个Source 的每个项 比如
<TextBlock Text={Binding Source[0]}/>
<TextBlock Text={Binding Source[1]}/>
<TextBlock Text={Binding Source[2]}/>

使用这个MyControl的时候 我的ViewModel 里有个属性是 ObservableCollection<string> Names 作为MyControl的数据源比如:
<MyControl Source={Binding Names}/>
到这里 一切都顺利 我的6个文本框都显示了数据源里的字符串
现在我有个改变 我要建一个Man类 把Name作为属性放进去 并且再加一个 Age的属性 比如
class Man()
{
private string name=string.Empty;
public string Name{get{return name ;};set{name = value ; RaisePropertyChanged(nameof(name));}}

private int age=0;
public int Age.........
}

这样的话 原本ObservableCollection<string> Names 的数据源 变成了ObservableCollection<Man> Mans

而我绑定的是Mans里面的Name这个属性的集合 我该如何实现绑定呢?
我目前用了一个笨办法实现了 但是感觉不是最好 是再建一个属性集合去得到这个Name的集合 比如
public ICollection<string> Names{ get { return this.Mans.Select(o=> o.Name).ToList(); } }
然后每次set属性后还要额外通过事件去通知父对象去RaisePropertyChanged 这个Names集合。
可用分不多了希望朋友们支个招吧。
...全文
294 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmidl 2017-03-20
  • 打赏
  • 举报
回复
结帖 分数计算有问题,永远剩5分 解不了贴啊?明天再来吧
zmidl 2017-03-20
  • 打赏
  • 举报
回复
引用 8 楼 xuggzu 的回复:
你是不想改xaml呈现?那就再给man类加个object属性,绑定它,代码里想给它什么就给什么。但我有个疑问,xaml也就改个绑定,那界面的标题或其它你怎么.统一?
好吧就这么招了。
  • 打赏
  • 举报
回复
获取Man类的所有属性,后台遍历属性集合,同时生成xaml以及对应的绑定。就是从后台生成前台的xaml。
xuggzu 2017-03-19
  • 打赏
  • 举报
回复
你是不想改xaml呈现?那就再给man类加个object属性,绑定它,代码里想给它什么就给什么。但我有个疑问,xaml也就改个绑定,那界面的标题或其它你怎么.统一?
zmidl 2017-03-19
  • 打赏
  • 举报
回复
引用 3 楼 zmidl 的回复:
[quote=引用 1 楼 Forty2 的回复:] 不妨试试? <TextBlock Text={Binding Source[0].Name}/>
这个我知道啊 但是 这个Name也是一个集合啊 是我的Mans 里面所有的Name 如果ObservableCollection<Man> 有10行那么我要10个Name的集合。[/quote] 这里我理解错了 请无视这条回复
引用 6 楼 xuggzu 的回复:
datacontext=mans text=binding Value[0].Name
这个明白 我试过了 ok的 问题是如果这个MyControl控件今后改需求了 要显示年龄了 我还得改代码 把“text=binding Value[0].Name”改成“text=binding Value[0].Age” 不是 。既然依赖属性通过外部注入的话,尽可能可以改变数据源的绑定方式 而不用去动相对底层的代码。是想有这么一个方式的,不知道还有什么好办法。
cheng2005 2017-03-19
  • 打赏
  • 举报
回复
楼主真有意思,界面上本来显示name,以后想改成显示age。这根本就是界面的改动,不去改界面,反而要去改数据。 就好像昨天吃的土豆,今天想吃辣椒,不去买辣椒吃,而且做手术把自己的嘴改造,好让嘴觉得吃的不是土豆,而是辣椒。 真实难以理解楼主的思维。
xuggzu 2017-03-18
  • 打赏
  • 举报
回复
datacontext=mans
text=binding Value[0].Name
zmidl 2017-03-18
  • 打赏
  • 举报
回复
引用 2 楼 xuggzu 的回复:
同上,xaml绑定可以有下标,也可以指定属性
我有个想法 就是 让我的控件的 DataContent = {Binding Mans} 然后 我的Source={Binding Name} 但是没有效果 绑定不了
zmidl 2017-03-18
  • 打赏
  • 举报
回复
引用 1 楼 Forty2 的回复:
不妨试试? <TextBlock Text={Binding Source[0].Name}/>
引用 1 楼 Forty2 的回复:
不妨试试? <TextBlock Text={Binding Source[0].Name}/>
额。。这样我的自定义的控件MyControl 不是没有面向对象了吗?以后绑定其他属性 我还得改我的控件库啊!这个也是个笨办法不是长久之计啊。。。
zmidl 2017-03-18
  • 打赏
  • 举报
回复
引用 1 楼 Forty2 的回复:
不妨试试? <TextBlock Text={Binding Source[0].Name}/>
这个我知道啊 但是 这个Name也是一个集合啊 是我的Mans 里面所有的Name 如果ObservableCollection<Man> 有10行那么我要10个Name的集合。
xuggzu 2017-03-18
  • 打赏
  • 举报
回复
同上,xaml绑定可以有下标,也可以指定属性
Forty2 2017-03-18
  • 打赏
  • 举报
回复
不妨试试? <TextBlock Text={Binding Source[0].Name}/>

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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