Silverlight -动态数量的属性需要为我的方案
本文关键字:我的 方案 属性 动态 Silverlight | 更新日期: 2023-09-27 18:08:05
我手头的是一个应用程序,它可以帮助找出如何使用多种技术清理被污染的场地(多种污染物)。当然,我要有一个技术班和一个污染物班。
Class Pollutant
{
string name;
double baselineAmount;
double reduction goal
...
}
List<Pollutant> pollutantsList=new List<Pollutant>;
Class Technique
{
string name;
List <PerPollutantProperties> PollutantRelatedProperties=new List<PerPollutantProperties>();
...
}
Class PerPollutantProperties
{
string name;
double CurrentLoad=0;
double ReducedLoad=0;
...
}
List<Technique> techniquesList= new List<Technique>();
main()
{
Pollutant pollutant1 = new Pollutant();
Pollutant pollutant2 = new Pollutant();
...
pollutantsList.Add(pollutant1);
pollutantsList.Add(pollutant2);
Technique tec1=new Technique();
Technique tec2=new Technique();
tec1.name="tec1";
tec2.name="tec2";
PerPollutantProperties PPP= new PerPollutantProperties();
PPP.name="Nitrogen";
tec1.PollutantRelatedProperties.Add(PPP);
tec2.PollutantRelatedProperties.Add(PPP);
PPP= new PerPollutantProperties();
PPP.name="Phorsphorus";
tec1.PollutantRelatedProperties.Add(PPP);
tec2.PollutantRelatedProperties.Add(PPP);
PPP= new PerPollutantProperties();
PPP.name="Sediment";
tec1.PollutantRelatedProperties.Add(PPP);
tec2.PollutantRelatedProperties.Add(PPP);
techniquesList.Add(tec1);
techniquesList.Add(tec2);
...
dataGridTechniques.ItemSource = techniquesList;
}
XAML: <sdk:DataGrid AutoGenerateColumns="False" Height="Auto" HorizontalAlignment="Left" Margin="12,483,0,0" Name="dataGridTechniques"
VerticalAlignment="Top" Width="Auto" RowHeight="55">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Current Load (lbs/yr)" Width="Auto">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:LayoutTransformer RenderTransformOrigin="0,0" >
<toolkit:LayoutTransformer.LayoutTransform>
<RotateTransform Angle="-90"/>
</toolkit:LayoutTransformer.LayoutTransform>
<sdk:DataGrid ItemsSource="{Binding PollutantRelatedProperties}"
RowHeight="70" HeadersVisibility="None" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Width="25" Header="currentLoad">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:LayoutTransformer>
<toolkit:LayoutTransformer.LayoutTransform>
<RotateTransform Angle="90"/>
</toolkit:LayoutTransformer.LayoutTransform>
<TextBlock Text="{Binding CurrentLoad,Converter={StaticResource MyDoubleToStringRoundConverter}}" />
</toolkit:LayoutTransformer>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Width="25" Header="Pollutant">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:LayoutTransformer>
<toolkit:LayoutTransformer.LayoutTransform>
<RotateTransform Angle="90"/>
</toolkit:LayoutTransformer.LayoutTransform>
<TextBlock Text="{Binding PollutantName}" />
</toolkit:LayoutTransformer>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</toolkit:LayoutTransformer>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="Reduced Load (lbs/yr)" Width="Auto">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:LayoutTransformer RenderTransformOrigin="0,0" >
<toolkit:LayoutTransformer.LayoutTransform>
<RotateTransform Angle="-90"/>
</toolkit:LayoutTransformer.LayoutTransform>
<sdk:DataGrid ItemsSource="{Binding PollutantRelatedProperties}"
RowHeight="70" HeadersVisibility="None" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Width="25" Header="reducedLoad">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:LayoutTransformer>
<toolkit:LayoutTransformer.LayoutTransform>
<RotateTransform Angle="90"/>
</toolkit:LayoutTransformer.LayoutTransform>
<TextBlock Text="{Binding ReducedLoad,Converter={StaticResource MyDoubleToStringRoundConverter}}" />
</toolkit:LayoutTransformer>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Width="25" Header="Pollutant">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:LayoutTransformer>
<toolkit:LayoutTransformer.LayoutTransform>
<RotateTransform Angle="90"/>
</toolkit:LayoutTransformer.LayoutTransform>
<TextBlock Text="{Binding PollutantName}" />
</toolkit:LayoutTransformer>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</toolkit:LayoutTransformer>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
棘手的部分是应用程序应该允许用户添加/删除污染物/技术以供考虑,每种技术对每种污染物具有不同的减少效率。这意味着每增加一种污染物,就需要在技术类中增加一种更有效的污染物。我应该如何构建技术类来适应这一点?我想将technqueslist绑定到类似数据网格的东西上,用户可以在其中输入自定义的信息,例如减少效率。
编辑:决定在Technique类中使用List(实际上是ObservableCollection/其他帖子和RKaufman的建议)属性,并嵌套数据网格。到目前为止,我遇到了两个问题。
问题1。除了在嵌套的DG中用XAML设置的列之外,数据源的每个属性也显示为列。我最初不得不在后面的代码中将它们的可见性设置为"collapse",但是在编辑这篇文章时,我发现我可以简单地将autogeneratecolumcolumns设置为False来删除多余的列。
问题2。每个嵌套的Datagrid的第0行和第0列中的TextBlock元素在它们周围有焦点变换。如果可能的话,我想知道为什么以及如何关掉它们。即使我点击UI的其他区域,它们也不会消失。
截图(抱歉,还没有足够的rep来嵌入图片):http://xyk.iwebs.ws/nestedDG_textBlock_highlight.JPG
如果我理解正确的话,你需要能够在技术中添加或去除污染物。如果这是正确的,那么每种技术都需要收集污染物。要向用户显示这些信息,使用带有行详细信息模板的数据网格可以解决这个问题。至于向技术中添加污染物,我建议您使用单独的页面或子窗口来添加/编辑技术,并使用几个列表框来选择/取消选择污染物。我也会使用System.Collections.ObjectModel.ObservableCollection,而不是List,因为它实现了INotifyCollectionChanged,当你从集合中添加或删除项目时,它会给你的UI通知。
如果这是不正确的,让我知道或给我一些更多的信息,我会尝试指导你进一步