我必须为我做一项艰巨的任务,也许你可以帮助我。我尝试设计一个窗口对话框来更新数据库视图中的数据。此数据库视图包含整数,DateTime,字符串,时间,布尔属性。
首先,我将数据库视图数据加载到GridControl中。 GridControl只能是不可编辑的。我动态配置GridControl的列,此配置位于名为FieldDescription的数据库表中。
当最终用户双击一个单元格时,会弹出此窗口对话框。当列的类型为枚举或位(布尔值)时,此对话框显示组合框,否则显示TextEdit作为默认内容。例如,我知道GridColumn由于FieldDescription而表示枚举类型。因为绑定到此GridColumn的此数据库视图属性的类型是整数(特别是值)
此窗口对话框的代码是(我使用DevExpress控件):
<!-- DataTemplates -->
<DataTemplate x:Key="DefaultTemplate">
<dxe:TextEdit Name="TxtNewValue" Grid.Column="0" Margin="0"
HorizontalAlignment="Stretch"
Text="{Binding TargetValue, UpdateSourceTrigger=PropertyChanged}"
Mask="{Binding TargetFieldDescription.fdValidateExp}"
Loaded="FocusTextEditOnLoad"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding TargetFieldType}" Value="{x:Static eva:FieldDataType.Date}">
<Setter TargetName="TxtNewValue" Property="MaskType" Value="DateTime" />
</DataTrigger>
<DataTrigger Binding="{Binding TargetFieldType}" Value="{x:Static eva:FieldDataType.DatTime}">
<Setter TargetName="TxtNewValue" Property="MaskType" Value="DateTime" />
</DataTrigger>
<DataTrigger Binding="{Binding TargetFieldType}" Value="{x:Static eva:FieldDataType.Time}">
<Setter TargetName="TxtNewValue" Property="MaskType" Value="RegEx" />
</DataTrigger>
<DataTrigger Binding="{Binding TargetFieldType}" Value="{x:Static eva:FieldDataType.Num}">
<Setter TargetName="TxtNewValue" Property="MaskType" Value="RegEx" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate x:Key="ComboboxTemplate">
<dxe:ComboBoxEdit ItemsSource="{Binding EnumItemsSource}"
DisplayMember="Name"
ValueMember="Id"
IsTextEditable="False"
EditValue="{Binding TargetValue, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
<!-- Select a Datatemplate depending on the type of the Enum FieldDataType-->
<DataTemplate DataType="{x:Type massedit:SimpleFieldVM}">
<ContentControl Content="{Binding .}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}" />
<Style.Triggers>
<!-- Without selector, only with DataTriggers select my ContentControl -->
<DataTrigger Binding="{Binding TargetFieldType}" Value="{x:Static eva:FieldDataType.ENum}">
<Setter Property="ContentTemplate" Value="{StaticResource ComboboxTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding TargetFieldType}" Value="{x:Static eva:FieldDataType.Bit}">
<Setter Property="ContentTemplate" Value="{StaticResource ComboboxTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</Window.Resources>
<!-- Layout -->
<Grid x:Name="LayoutRoot" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<ContentControl Name="MainLayout" Content="{Binding}" />
</Grid>
我只有一个ViewModel来为此对话窗口提供值。我的ViewModel有一个名为TargetFieldType的枚举FieldDataType属性。它包含doubleclicked GridColumn的类型。此值为Enum(FieldDataType.DatTime,FieldDataType.Time,FieldDataType.Date,FieldDataType.Bit,FieldDataType.Num,FieldDataType.Enum,FieldDataType.String)。
Combobox的ItemsSource与ViewModel属性绑定: public List EnumItemsSource
根据列的类型,我准备数据,并在List中转换我的模型的枚举,也是List中的布尔属性(是,否)。但我的ViewModel必须根据FieldDataType准备数据。也许我可以在xaml代码中添加更多代码来保存大量代码,以便将提供的数据准备到我的视图中......或者将更多ViewModel分离到我当前的ViewModel中,以便做到这一点。
很难解释整个任务,但也许你可以帮助并告诉我,我的方法是正确还是太难。我希望,你理解我的意思。提出所需的问题。
由于