“DataContext数据上下文”绑定不上 , Why???

starrycheng 2012-07-25 01:31:09
“DataContext数据上下文”绑定不上 , Why???

思路:

1、将“数据集类的实例对象”赋值给“Grid”的数据上下文,DataContext。

2、“Grid”里有一个“Lable”,一个“DataGrid”进行数据绑定。

问题:数据绑定不上。

1、后台代码:

public partial class CustomReportTest : UserControl
{
public CustomReportTest()
{
InitializeComponent();

EnergyList energylist = new EnergyList();
LayoutRoot.DataContext = energylist;

//dg_EnergyCustom.ItemsSource = energylist.energylist;
}
}

public class EnergyList
{
private string _energytitle;


public string EnergyTitle
{
get {return _energytitle;}
set { _energytitle = "指标报表"; }
}


public List<EnergyTarget> energylist = new List<EnergyTarget> {
new EnergyTarget{EnergyYear="2010",EnergySum="7678.09",EnergyEveryOne="89.78",EnergyUnitArea="45.65"},
new EnergyTarget{EnergyYear="2011",EnergySum="8978.48",EnergyEveryOne="67.75",EnergyUnitArea="43.63"}
};
}

public class EnergyTarget
{


public string EnergyYear
{
get;
set;
}

public string EnergySum
{
get;
set;
}

public string EnergyUnitArea
{
get;
set;
}

public string EnergyEveryOne
{
get;
set;
}


}
2、XAML代码



<Grid x:Name="LayoutRoot" Background="White">
<Grid Margin="69,80,79,82">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>

<sdk:Label Background="#FFB7D4E0" Content="{Binding EnergyTitle}"/>
<sdk:DataGrid Grid.Row="1" Name="dg_EnergyCustom" AutoGenerateColumns="False" ItemsSource="{Binding energylist}">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn DisplayIndex="-1" Header="年份" IsReadOnly="True" Width="30*" >
<sdk:DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<TextBlock FontSize="13" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding EnergyYear}"></TextBlock>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="项目" Width="30*">
<sdk:DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Grid ShowGridLines="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<TextBlock Text="能耗量合计" Grid.Row="0" ></TextBlock>
<TextBlock Text="单位面积能耗" Grid.Row="1"></TextBlock>
<TextBlock Text="生均能耗" Grid.Row="2"></TextBlock>
</Grid>

</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="全校" Width="40*">
<sdk:DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Grid ShowGridLines="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding EnergySum}" ></TextBlock>
<TextBlock Grid.Row="1" Text="{Binding EnergyUnitArea}" ></TextBlock>
<TextBlock Grid.Row="2" Text="{Binding EnergyEveryOne}"></TextBlock>
</Grid>

</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>

</sdk:DataGrid>

</Grid>
</Grid>


3、运行效果,数据绑定不上,Why???

...全文
504 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
starrycheng 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 13 楼 的回复:
引用 12 楼 的回复:

问题1:
List没有继承INotifyCollectionChanged,所有集合发生变化的时候没法通知绑定的目标。
使用System.Collections.ObjectModel.ObservableCollection<T>

问题2:
随便baidu一下,C# 属性。


在客户端对属性进行“重新赋值”,然后……
[/Quote]

有道理。。。
cheng2005 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 12 楼 的回复:

问题1:
List没有继承INotifyCollectionChanged,所有集合发生变化的时候没法通知绑定的目标。
使用System.Collections.ObjectModel.ObservableCollection<T>

问题2:
随便baidu一下,C# 属性。


在客户端对属性进行“重新赋值”,然后绑定到客户端也要实现“Syste……
[/Quote]
你要先弄明白叫做数据源集合内部发生变化,什么叫做绑定的数据源本身发生变化.
starrycheng 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

问题1:
List没有继承INotifyCollectionChanged,所有集合发生变化的时候没法通知绑定的目标。
使用System.Collections.ObjectModel.ObservableCollection<T>

问题2:
随便baidu一下,C# 属性。
[/Quote]

在客户端对属性进行“重新赋值”,然后绑定到客户端也要实现“System.Collections.ObjectModel.ObservableCollection<T>”接口???
starrycheng 2012-07-27
  • 打赏
  • 举报
回复
补一下。。。
cheng2005 2012-07-27
  • 打赏
  • 举报
回复
问题1:
List没有继承INotifyCollectionChanged,所有集合发生变化的时候没法通知绑定的目标。
使用System.Collections.ObjectModel.ObservableCollection<T>

问题2:
随便baidu一下,C# 属性。
starrycheng 2012-07-27
  • 打赏
  • 举报
回复
问题一:必须要这样,在构造函数中为类的属性赋值才可以吗???

public EnergyList()
{
_energylista = new List<EnergyTarget> {
new EnergyTarget{EnergyYear="2010",EnergySum="7678.09",EnergyEveryOne="89.78",EnergyUnitArea="45.65"},
new EnergyTarget{EnergyYear="2011",EnergySum="8978.48",EnergyEveryOne="67.75",EnergyUnitArea="43.63"}
};

EnergyTitle = "指标报表";
}

问题二:直接这样定义“成员变量”,不行吗???

public List<EnergyTarget> energylist = new List<EnergyTarget> {
new EnergyTarget{EnergyYear="2010",EnergySum="7678.09",EnergyEveryOne="89.78",EnergyUnitArea="45.65"},
new EnergyTarget{EnergyYear="2011",EnergySum="8978.48",EnergyEveryOne="67.75",EnergyUnitArea="43.63"}
};

“public List<EnergyTarget> energylist = new List<EnergyTarget>”这不叫属性,对吧???
ohkuy 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

要绑定集合
LayoutRoot.DataContext = energylist.energylist;


页面初始化的时候已经绑定了啊。

如下:LayoutRoot.DataContext = energylist;
[/Quote]
看仔细点,
你绑定的是实例energylist
集合变量名也是energylist
所以绑定:
LayoutRoot.DataContext = energylist.energylist;
五位数 2012-07-26
  • 打赏
  • 举报
回复
我给你改了一下。后台
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
EnergyList energylist = new EnergyList();
energylist.EnergyTitle = "指标报表";
LayoutRoot.DataContext = energylist;
}
}
public class EnergyList
{
private string _energytitle;


public string EnergyTitle
{
get { return _energytitle; }
set { _energytitle = "指标报表"; }
}

public EnergyList()
{
this.energylist= new List<EnergyTarget> {
new EnergyTarget{EnergyYear="2010",EnergySum="7678.09",EnergyEveryOne="89.78",EnergyUnitArea="45.65"},
new EnergyTarget{EnergyYear="2011",EnergySum="8978.48",EnergyEveryOne="67.75",EnergyUnitArea="43.63"}
};
}
private List<EnergyTarget> energylist = null;

public List<EnergyTarget> Energylist
{
get { return energylist; }
set { energylist = value; }
}
}

public class EnergyTarget
{


public string EnergyYear
{
get;
set;
}

public string EnergySum
{
get;
set;
}

public string EnergyUnitArea
{
get;
set;
}

public string EnergyEveryOne
{
get;
set;
}

}
前台
<Grid Name="LayoutRoot" >

<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>

<Label Background="#FFB7D4E0" Content="{Binding EnergyTitle}"/>
<DataGrid Grid.Row="1" Name="dg_EnergyCustom" AutoGenerateColumns="False" ItemsSource="{Binding Energylist}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="年份" IsReadOnly="True" Width="30*" >
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<TextBlock FontSize="13" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding EnergyYear}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="项目" Width="30*">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Grid ShowGridLines="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<TextBlock Text="能耗量合计" Grid.Row="0" ></TextBlock>
<TextBlock Text="单位面积能耗" Grid.Row="1"></TextBlock>
<TextBlock Text="生均能耗" Grid.Row="2"></TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="全校" Width="40*">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Grid ShowGridLines="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="20" />
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding EnergySum}" ></TextBlock>
<TextBlock Grid.Row="1" Text="{Binding EnergyUnitArea}" ></TextBlock>
<TextBlock Grid.Row="2" Text="{Binding EnergyEveryOne}"></TextBlock>
</Grid>

</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>

</DataGrid>
</Grid>
五位数 2012-07-26
  • 打赏
  • 举报
回复
你的energylist 必须要写属性。反则,界面获取不到数据。第一个字段也不对
starrycheng 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

EnergyList energylist = new EnergyList();
LayoutRoot.DataContext = energylist;
dg_EnergyCustom.ItemsSource = energylist.energylist;
要用dg_EnergyCustom绑定集合,将标记里的删掉,
没有意义,因为初始化时集合是空的,
只有……
[/Quote]

意思不太一致啊。

1、直接为“DataGrid”指定数据集。
EnergyList energy = new EnergyList();
dg_EnergyCustom.ItemsSource = energy.energylist;

这样可行没问题,但问题是通过数据上下文绑定不行啊。

2、通过数据上下文。

XAML定义:

<Grid x:Name="LayoutRoot" Background="White">
<sdk:Label Background="#FFB7D4E0" Content="{Binding EnergyTitle}"/>

<sdk:DataGrid Grid.Row="1" Name="dg_EnergyCustom" AutoGenerateColumns="False" ItemsSource="{Binding energylist}">

后台代码:

EnergyList energy = new EnergyList();
LayoutRoot.DataContext = energy;


是数据上下文绑定不行,不是直接绑定数据集不行。
ohkuy 2012-07-26
  • 打赏
  • 举报
回复
EnergyList energylist = new EnergyList();
LayoutRoot.DataContext = energylist;
dg_EnergyCustom.ItemsSource = energylist.energylist;
要用dg_EnergyCustom绑定集合,将标记里的删掉,
没有意义,因为初始化时集合是空的,
只有实例化类后集合才有值,
这时绑定才不为空
亲测可行!
starrycheng 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

引用 2 楼 的回复:

要绑定集合
LayoutRoot.DataContext = energylist.energylist;


页面初始化的时候已经绑定了啊。

如下:LayoutRoot.DataContext = energylist;

看仔细点,
你绑定的是实例energylist
集合变量名也是energylist
……
[/Quote]

不是的,大师。

这里写的不好。

应该是:
EnergyList energy = new EnergyList();
LayoutRoot.DataContext = energy;

问题:energylist是“EnergyList”类的一个属性。
要绑定的是“energy”,而不是它的属性energylist。


starrycheng 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

要绑定集合
LayoutRoot.DataContext = energylist.energylist;
[/Quote]

页面初始化的时候已经绑定了啊。

如下:LayoutRoot.DataContext = energylist;
ohkuy 2012-07-25
  • 打赏
  • 举报
回复
要绑定集合
LayoutRoot.DataContext = energylist.energylist;
蝶恋花雨 2012-07-25
  • 打赏
  • 举报
回复
WPF?设断点瞅下。WPF还没玩过来。

110,571

社区成员

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

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

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