【发布时间】:2013-11-29 18:49:10
【问题描述】:
型号:
枚举:
public enum StabilityLevel
{
Unstable,
Neutral,
Stable
}
public enum WindspeedClass
{
Class1,
Class2,
Class3
}
风玫瑰:
public class Windrose
{
// percentual value for given direction
private short[][][] _percentage;
// average wind speed in wind speed classes
private float[][] _average;
public Windrose()
{
_percentage = new short[Enum.GetNames(typeof(StabilityLevel)).Length][][];
foreach (StabilityLevel stability in EnumUtil.GetValues<StabilityLevel>())
{
_percentage[(int) stability] = new short[Enum.GetNames(typeof(WindspeedClass)).Length][];
foreach (WindspeedClass windspeed in EnumUtil.GetValues<WindspeedClass>())
{
// We reserve 0 for a special no-wind value, and we limit the maximum number of directions to 36
_percentage[(int) stability][(int) windspeed] = new short[37];
}
}
_average = new float[Enum.GetNames(typeof(StabilityLevel)).Length][];
foreach (StabilityLevel stability in EnumUtil.GetValues<StabilityLevel>())
{
_average[(int) stability] = new float[Enum.GetNames(typeof(WindspeedClass)).Length];
}
NumberOfDirections = 8;
}
public string Name { get; set; }
public int NumberOfDirections { get; set; }
public StabilityLevel StabilityLevel { get; set; }
public WindspeedClass Windspeed { get; set; }
public short[] Percentage
{
get
{
return _percentage[(int) StabilityLevel][(int) Windspeed];
}
}
public float Average
{
get
{
return _average[(int) StabilityLevel][(int) Windspeed];
}
set
{
_average[(int)StabilityLevel][(int)Windspeed] = value;
}
}
}
查看:
现在让我们看看这个视图 (xaml),它被用作创建新 Windrose 的模态窗口:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" HorizontalAlignment="Left" ContentStringFormat="{}{0}:" Content="Name" />
<TextBox Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="1" HorizontalAlignment="Left" ContentStringFormat="{}{0}:" Content="Number of directions" />
<ComboBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" SelectedItem="{Binding Path=NumberOfDirections, UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="4" />
<ComboBoxItem Content="8" />
<ComboBoxItem Content="12" />
<ComboBoxItem Content="16" />
<ComboBoxItem Content="36" />
</ComboBox>
<Label Grid.Row="2" HorizontalAlignment="Left" ContentStringFormat="{}{0}:" Content="Stability Level" />
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Vertical">
<RadioButton HorizontalAlignment="Left" IsChecked="{Binding Path=StabilityLevel, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static model:StabilityLevel.Unstable}}" Content="A - Unstable" />
<RadioButton HorizontalAlignment="Left" IsChecked="{Binding Path=StabilityLevel, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static model:StabilityLevel.Neutral}}" Content="B - Neutral" />
<RadioButton HorizontalAlignment="Left" IsChecked="{Binding Path=StabilityLevel, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static model:StabilityLevel.Stable}}" Content="C - Stable" />
</StackPanel>
<Grid Grid.Row="3" Grid.ColumnSpan="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<RadioButton Grid.Row="0" HorizontalAlignment="Left" IsChecked="{Binding Path=Windspeed, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static model:WindspeedClass.Class1}}" Content="1 - 0 to 2 meters per second" />
<TextBox Grid.Row="0" Grid.Column="1" Width="30" Text="{Binding Path=???, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
<RadioButton Grid.Row="1" HorizontalAlignment="Left" IsChecked="{Binding Path=Windspeed, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static model:WindspeedClass.Class2}}" Content="2 - 2 to 4 meters per second" />
<TextBox Grid.Row="1" Grid.Column="1" Width="30" Text="{Binding Path=???, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
<RadioButton Grid.Row="2" HorizontalAlignment="Left" IsChecked="{Binding Path=Windspeed, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static model:WindspeedClass.Class3}}" Content="3 - over 4 meters per second" />
<TextBox Grid.Row="2" Grid.Column="1" Width="30" Text="{Binding Path=???, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
</Grid>
<DataGrid Grid.Row="4" Margin="5" ItemsSource="{Binding Percentage}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Wind direction" Width="SizeToHeader">
</DataGridTextColumn>
<DataGridTemplateColumn Header="Percentage" Width="SizeToHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding ???}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
因此,对于每个“稳定性级别”“风速等级”对,windrose 实例保留一个包含 37 个值和一个额外浮点值的数组。
我不知道怎么做 2 件事:
A)
我不知道如何创建这个表(DataGrid)。我希望能够根据所选的 NumberOfDirections 更改动态生成的行数。 选定的 NumberOfDirections 还决定了两个后续行之间的“步长”(360 度除以 NumberOfDirections)。
B)
在 x:Name="WSClass" 的网格中,我希望能够将 _average 数组的项目绑定到 TextBoxes,以便每个 TextBox 对应于某个 RadioButton(代表风速类) 具有值 _average[选定的稳定性][相应 RadioButton 的风速]。
【问题讨论】:
标签: c# wpf mvvm binding datagrid