WPF,这个DataGrid数据绑定哪里出错了?

对方的身份地方 2013-09-10 12:13:03

<Grid>
<DataGrid Name="datagrid1" Margin="148,68,0,0" AutoGenerateColumns="False" Height="131" Width="244">
<DataGrid.Columns>
<DataGridTextColumn Header="科室" Width="105" Binding="{Binding Path=Name}" />
<DataGridTextColumn Header="人数" Binding="{Binding Path=Number}" />
<DataGridComboBoxColumn ItemsSource="{Binding Path=People}" SelectedItemBinding="{Binding Path=K_科长}"
Header="科长" />
</DataGrid.Columns>
</DataGrid>
</Grid>



public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ObservableCollection<Company> obc = new ObservableCollection<Company>();
obc.Add(new Company() { Name = "人教科",Number=2,K_科长="熊俊",People=new List<string>(){"熊俊","王晓"}});
obc.Add(new Company() { Name = "广告科", Number = 2, K_科长 = "汤姆", People = new List<string>() { "汤姆", "杰克" } });
obc.Add(new Company() { Name = "财会科", Number = 2, K_科长 = "李莹", People = new List<string>() { "李莹", "张三" } });
obc.Add(new Company() { Name = "人教科", Number = 4, K_科长 = "李刚", People = new List<string>() { "李刚", "王二","牛熊","刘麻子" } });
datagrid1.ItemsSource = obc;
}
}



class Company
{
public string Name { get; set; }
public int Number { get; set; }
public string K_科长 { get; set; }
public List<string> People { get; set; }
}



上面代码,DataGridComboBoxColumn列绑定到Pelple属性,可是为什么结果这一列没有显示呢?
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-09-10
  • 打赏
  • 举报
回复
DataGridComboBoxColumn的ItemsSource是使用的外部设置的DataContext对象的属性进行绑定的,而不是每个Items对象的属性进行绑定的。
马虎维 2013-09-10
  • 打赏
  • 举报
回复
没有指定DataGrid对应的ItemsSource
  • 打赏
  • 举报
回复
引用 7 楼 blwuer 的回复:
为了弥补我看错了楼主的问题,经过搜索找到了解决楼主的问题方法。 使用模板列可以满足楼主的需求

<DataGridTemplateColumn Header="科长">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding People}" SelectedItem="{Binding Path=K_科长}"></ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
用模板列是可以解决,不过,我在MSDN上却找不到说ItemsSource必须是列的所有单元格都具有相同的集合。而且我那样设置,也实在不知道错在哪里
langxiansheng 2013-09-10
  • 打赏
  • 举报
回复
问题解决了吗?
blwuer 2013-09-10
  • 打赏
  • 举报
回复
为了弥补我看错了楼主的问题,经过搜索找到了解决楼主的问题方法。 使用模板列可以满足楼主的需求

<DataGridTemplateColumn Header="科长">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding People}" SelectedItem="{Binding Path=K_科长}"></ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 5 楼 u011965849 的回复:
[quote=引用 3 楼 blwuer 的回复:] 这个问题我当初也遇到过。 问题是你的People里面的数据和“K_科长”的数据不是同一个引用所以绑定不会出现你希望的选择项。 你可以新建一个People类,并重载Equals,重载的目的是wpf会调用Equals比较并选择目标项。
字符串应该是可以比较的吧,假如ItemsSource绑定到不是Pelple属性,而是一个共享的集合,都不需要作比较的[/quote] 很抱歉,是我没看清楚。 你这个问题应该出在ItemsSource的绑定上。这个ItemsSource是一列的,如果你要为每一行提供不同的ItemsSource应该要做额外的处理
  • 打赏
  • 举报
回复
引用 3 楼 blwuer 的回复:
这个问题我当初也遇到过。 问题是你的People里面的数据和“K_科长”的数据不是同一个引用所以绑定不会出现你希望的选择项。 你可以新建一个People类,并重载Equals,重载的目的是wpf会调用Equals比较并选择目标项。
字符串应该是可以比较的吧,假如ItemsSource绑定到不是Pelple属性,而是一个共享的集合,都不需要作比较的
灬浪子灬 2013-09-10
  • 打赏
  • 举报
回复
没有设置SelectedValuePath与DisplayMemberPath
blwuer 2013-09-10
  • 打赏
  • 举报
回复
这个问题我当初也遇到过。
问题是你的People里面的数据和“K_科长”的数据不是同一个引用所以绑定不会出现你希望的选择项。
你可以新建一个People类,并重载Equals,重载的目的是wpf会调用Equals比较并选择目标项。


class People
{
pubic string Name{set;get;}

public override bool Equals(object obj)
{
if (this == obj) return true;

if (obj == null || this.GetType() != obj.GetType())
{
return false;
}

People p = obj as People;
if(p=null) return false;
return this.Name == obj.Name;
}
}
cjh200102 2013-09-10
  • 打赏
  • 举报
回复
List<string> People 不能直接绑定到DataGridComboBoxColumn列绑定到Pelple属性 需求转换成字符串
  • 打赏
  • 举报
回复
有人知道吗???

110,538

社区成员

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

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

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