![](/img/trans.png)
[英]Is locking necessary in this ConcurrentDictionary caching scenario
[英]Silverlight - dynamic number of properties necessary for my scenario?
我手頭有一個應用程序,可以幫助您弄清楚如何使用多種技術來清潔受污染的地點(多種污染物)。 自然地,我將擁有一個技術類和一個污染物類。
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>
棘手的部分是應用程序應允許用戶添加/刪除污染物/技術以供考慮,並且每種技術對每種污染物的還原效率都不同。 這意味着對於每種添加的污染物,需要在“技術”類別中添加一種更有效的方法。 我應該如何構造Technique類以適應這種情況? 我想將TechniquesList綁定到諸如數據網格之類的東西,用戶可以在其中輸入自定義信息,例如有效的回收。
編輯:決定在Technique類中使用一個List(實際上是ObservableCollection,以及其他建議和RKaufman的建議)屬性,並嵌套Datagrid。 到目前為止,我遇到了兩個問題。
問題1.除了我在XAML中在嵌套DG中設置的列之外,數據源的每個屬性也顯示為一列。 最初,我不得不在后面的代碼中將其可見性設置為“ Collapsed”,但是在編輯本文時,我發現可以將AutoGenerateColumns設置為False即可擺脫多余的列。
問題2。每個嵌套Datagrid的第0行和第0列中的TextBlock元素具有圍繞它們的焦點重新排列。 我不知道為什么以及如何在可能的情況下將其關閉。 即使我單擊UI的其他區域,它們也不會消失。
屏幕截圖(對不起,目前還不足以在帖子中嵌入圖像): http : //xyk.iwebs.ws/nestedDG_textBlock_highlight.JPG
如果我理解正確的話,您就需要能夠添加或去除技術中的污染物。 如果這是正確的,那么每種技術都需要收集污染物。 為了向用戶顯示此信息,帶有行詳細信息模板的數據網格將解決該問題。 至於將污染物添加到技術中,我建議您使用單獨的頁面或子窗口來添加/編輯該技術,並使用幾個列表框來選擇/取消選擇污染物。 我還將使用System.Collections.ObjectModel.ObservableCollection而不是List,因為它實現了INotifyCollectionChanged,並且在您添加或刪除集合中的項目時會向您的UI發出通知。
如果這不正確,請告訴我或給我更多信息,我會盡力為您提供指導。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.