具有不同DataTemplates的WPF窗口

时间:2013-11-27 22:31:41

标签: c# wpf xaml mvvm

我必须为我做一项艰巨的任务,也许你可以帮助我。我尝试设计一个窗口对话框来更新数据库视图中的数据。此数据库视图包含整数,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中,以便做到这一点。

很难解释整个任务,但也许你可以帮助并告诉我,我的方法是正确还是太难。我希望,你理解我的意思。提出所需的问题。

由于

0 个答案:

没有答案