WPF列表视图加载排序

WPF列表视图加载排序,wpf,list,listview,Wpf,List,Listview,问题是: **<local:SortableListView x:Name="ListViewControl" Grid.Row="0" ItemContainerStyle="{DynamicResource StretchedContainerStyle}" ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" IsSynchronizedWithCurrentItem="T

问题是:

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
我想在首次加载ListView时对其进行排序。 我已经实现了在列表视图中,如果标题列 在列表视图中单击

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
我找不到可以用来调用排序函数的合适事件。 我尝试使用初始化的UserControl和已加载的事件,但列表视图似乎不可用 调用这些函数时未填充

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
我尝试获取ListView的焦点。它可以工作,但是我必须点击窗口来完成排序

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
我希望在加载ListView后立即进行排序

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
我在列表视图中使用XML数据绑定。 ListView是UserControl的一部分。用户控件托管在MMC应用程序中

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
如果您需要任何其他信息,请告诉我

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
公共类SortableGridViewColumn:GridViewColumn { 公共字符串SortPropertyName { get{return(string)GetValue(SortPropertyNameProperty);} set{SetValue(SortPropertyNameProperty,value);} }

    // Using a DependencyProperty as the backing store for SortPropertyName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SortPropertyNameProperty =
        DependencyProperty.Register("SortPropertyName", typeof(string), 
        typeof(SortableGridViewColumn), new UIPropertyMetadata(""));

    public bool IsDefaultSortColumn
    {
        get { return (bool)GetValue(IsDefaultSortColumnProperty); }
        set { SetValue(IsDefaultSortColumnProperty, value); }
    }
    public static readonly DependencyProperty IsDefaultSortColumnProperty =
        DependencyProperty.Register("IsDefaultSortColumn", typeof(bool), 
        typeof(SortableGridViewColumn), new UIPropertyMetadata(false));
}


public class SortableListView : ListView
{
    public SortableListView()
    {                   

    }     

   SortableGridViewColumn lastSortedOnColumn = null;
   ListSortDirection lastDirection = ListSortDirection.Ascending;   



    public void Sort(string sortBy,  ListSortDirection direction)
    {        
        ICollectionView dataView = CollectionViewSource.GetDefaultView
            (this.ItemsSource);
        //Check if dataView isn't null
        if (dataView != null)
        {
            dataView.SortDescriptions.Clear();
            SortDescription sd1 = new SortDescription("@isenabled", direction);
            dataView.SortDescriptions.Add(sd1);

            SortDescription sd = new SortDescription(sortBy, direction);
            dataView.SortDescriptions.Add(sd);
            dataView.Refresh();
        }

    }


    private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
    {
        GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;

        if (headerClicked != null &&
            headerClicked.Role != GridViewColumnHeaderRole.Padding)
        {
             // attempt to cast to the sortableGridViewColumn object.
            SortableGridViewColumn sortableGridViewColumn = (headerClicked.Column) as SortableGridViewColumn;

            // ensure that the column header is the correct type and a sort property has been set.
            if (sortableGridViewColumn != null && !String.IsNullOrEmpty(sortableGridViewColumn.SortPropertyName))
            {

                ListSortDirection direction;
                bool newSortColumn = false;

                // determine if this is a new sort, or a switch in sort direction.
                if (lastSortedOnColumn == null
                    || String.IsNullOrEmpty(lastSortedOnColumn.SortPropertyName)
                    || !String.Equals(sortableGridViewColumn.SortPropertyName, lastSortedOnColumn.SortPropertyName, StringComparison.InvariantCultureIgnoreCase))
                {
                    newSortColumn = true;
                    direction = ListSortDirection.Ascending;
                }
                else
                {
                    if (lastDirection == ListSortDirection.Ascending)
                    {
                        direction = ListSortDirection.Descending;
                    }
                    else
                    {
                        direction = ListSortDirection.Ascending;
                    }
                }

                // get the sort property name from the column's information.
                string sortPropertyName = sortableGridViewColumn.SortPropertyName;

                // Sort the data.
                Sort(sortPropertyName, direction);

                lastSortedOnColumn = sortableGridViewColumn;
                lastDirection = direction;
            }
        }
    }

    protected override void OnInitialized(EventArgs e)       
    {
        base.OnInitialized(e);
        // add the event handler to the GridViewColumnHeader. This strongly ties this ListView to a GridView.
        this.AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(GridViewColumnHeaderClickedHandler));
        // cast the ListView's View to a GridView
        GridView gridView = this.View as GridView;

        if (gridView != null)
        {
            // determine which column is marked as IsDefaultSortColumn. Stops on the first column marked this way.1
            SortableGridViewColumn sortableGridViewColumn = null;

            foreach (GridViewColumn gridViewColumn in gridView.Columns)
            {
                sortableGridViewColumn = gridViewColumn as SortableGridViewColumn;
                if (sortableGridViewColumn != null)
                {
                    if (sortableGridViewColumn.IsDefaultSortColumn)
                    {
                        break;
                    }
                    sortableGridViewColumn = null;
                }
            }

            // if the default sort column is defined, sort the data 
            if (sortableGridViewColumn != null)
            {
                lastSortedOnColumn = sortableGridViewColumn;
                Sort(sortableGridViewColumn.SortPropertyName, ListSortDirection.Ascending);
            }
        }           
    }


}
    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
XAML如下所示:

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
**
**

我终于解决了这个问题。 我必须在ListView ItemSource上使用转换器,然后在Convert函数上对列表进行排序

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
代码如下:

    **<local:SortableListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"        
    ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=//CONFIGURATION}">           
        <ListView.View >
            <GridView >                    
                <local:SortableGridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@id}"
        IsDefaultSortColumn="True"
        SortPropertyName="@id"/>
                <local:SortableGridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        CellTemplateSelector="{DynamicResource myControlTemplateSelector}" 
        SortPropertyName="@value"/>
                <local:SortableGridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" 
        DisplayMemberBinding="{Binding XPath=./@data_type}"
        SortPropertyName="@data_type"/>
                <local:SortableGridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}"
        SortPropertyName="@description"
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>
    </local:SortableListView>**
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.Threading;
using System.Collections.ObjectModel;

namespace ...MiscellaneousCAESettings
{
    /// <summary>
    /// Interaction logic for ConfigDataView.xaml
    /// </summary>
    public partial class ConfigDataView : UserControl, IConfigDataViewControl 
    {

    ConfigDataViewPresenter _presenter = null;
    public static string _currDataType = "";
    public static string _min = "" ;
    public static string _max = "";        

    public string Min 
    {
        get
        {
         return _min;
        }
        set
        {
            _min = value ;
        }
    }

    public string Max
    {
        get
        {
            return _max;
        }
        set
        {
            _max = value;
        }
    }

    public string CurrDataType 
    {
        get
        {
            return _currDataType;
        }
        set
        {
            _currDataType = value;
        }
    }

    public ConfigDataView()
    {            
        InitializeComponent();

        //To give the classic windows look
        Uri uri = new Uri("PresentationFramework.Classic;V3.0.0.0;31bf3856ad364e35;component\\themes/classic.xaml", UriKind.Relative);
        this.Resources.MergedDictionaries.Add(Application.LoadComponent(uri) as ResourceDictionary);            
    }

    private void txtBoxGotFocus(object sender, RoutedEventArgs e)
    {
        Min = "" ;
        Max = "" ;

        TextBox txtbox = e.Source as TextBox;            
        this.ListViewControl.SelectedItem = txtbox.DataContext;

        //index         
        int index = this.ListViewControl.Items.IndexOf(this.ListViewControl.SelectedItem);

        System.ComponentModel.ICollectionView dataView = CollectionViewSource.GetDefaultView(this.ListViewControl.ItemsSource);

        object stCurr = (dataView.CurrentPosition ) ;

        //Check if the "data_type" attribute exists
        if (((XmlElement)dataView.CurrentItem).Attributes["data_type"] != null)
        {
            CurrDataType = ((XmlElement)dataView.CurrentItem).Attributes["data_type"].Value;
        }

        //Check if the "min" attribute exists
        if (((XmlElement)dataView.CurrentItem).Attributes["min"] != null)
        {
            Min = ((XmlElement)dataView.CurrentItem).Attributes["min"].Value;
        }

        //Check if the "min" attribute exists
        if (((XmlElement)dataView.CurrentItem).Attributes["max"] != null)
        {
            Max = ((XmlElement)dataView.CurrentItem).Attributes["max"].Value;
        }

    }


    #region IConfigDataViewControl Members

    public void LoadRootConfigData(string xmlFileName, string xmlFileContent, string xmlXPath)
    {
        try
        {
            XmlDocument configFileDoc = new XmlDocument();
            configFileDoc.LoadXml(xmlFileContent);

            XmlDataProvider xmldp = (XmlDataProvider)this.TryFindResource("dataProvider");
            xmldp.Document = configFileDoc;
            if (string.IsNullOrEmpty(xmlXPath))
            {
                xmldp.XPath = @"//node()[1]/node()[@value]";
            }
            else
            {
                xmldp.XPath = xmlXPath;
            }

            Binding bnd = new Binding();
            bnd.Source = xmldp;                
            bnd.Converter = new SortList();                 

            ListViewControl.SetBinding(ItemsControl.ItemsSourceProperty, bnd);


        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void LoadCategoryConfigData(string xmlFile, string xmlFileContent, string CategoryNodeName)
    {
        try
        {                
            XmlDocument configFileDoc = new XmlDocument();
            configFileDoc.LoadXml(xmlFileContent);

            XmlDataProvider xmldp = (XmlDataProvider)this.TryFindResource("dataProvider");
            xmldp.Document = configFileDoc;
            xmldp.XPath = @"//CONTEXT[@id='" + CategoryNodeName + @"']/CONFIGURATION";

            Binding bnd = new Binding();
            bnd.Source = xmldp;
            bnd.Converter = new SortList();
            ListViewControl.SetBinding(ItemsControl.ItemsSourceProperty, bnd);                
         }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);  
        }          
    }        

    public void AttachPresenter(ConfigDataViewPresenter cfgpresenter)
    {
        _presenter = cfgpresenter;
    }

    #endregion


    private void btn_ApplyClick(object sender, RoutedEventArgs e)
    {            
        XmlDataProvider odp = (XmlDataProvider)this.TryFindResource("dataProvider");

        XmlDocument configFileDoc = new XmlDocument();
        configFileDoc =odp.Document;

        _presenter.Save(configFileDoc.InnerXml );             
    }
}

public class TextBoxMinMaxValidation : ValidationRule
{

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        try
        {
            //Check for min max string length if it is a "Text" data type
            if (ConfigDataView._currDataType.ToLower() == "text")
            {
                int minLength = Convert.ToInt32(ConfigDataView._min);
                int maxLength = Convert.ToInt32(ConfigDataView._max);

                int strLength = value.ToString().Length;
                bool isValidLength = true;

                isValidLength = ((strLength >= minLength) && (strLength <= maxLength));

                if (!isValidLength)
                {
                    return new ValidationResult(false, string.Format("The input String Length is out of range. The String Length should be between {0} to {1}", minLength, maxLength));
                }
                else
                {
                    return new ValidationResult(true, null);
                }
            }

            //Check for min max string length if it is a "Numeric" data type
            if (ConfigDataView._currDataType.ToLower() != "numeric")
            {
                return new ValidationResult(true, null);
            }

            int min = Convert.ToInt32(ConfigDataView._min);
            int max = Convert.ToInt32(ConfigDataView._max);

            int res ;
            bool isNumber = int.TryParse(value.ToString(), out res);
            bool isValidRange = true;

            if (!isNumber)
            {
                return new ValidationResult(false, "The input string is in incorrect format. Should be a Number.");
            }

            isValidRange = ((res >= min) && (res <= max));

            if (!isValidRange)
            {
                return new ValidationResult(false, string.Format("The input integer is out of range. The number should be between {0} to {1}", min, max));
            }


        }
        catch
        {

        }

        return new ValidationResult(true, null);
    }
}    

public class ControlTemplateSelector : DataTemplateSelector
{
    public const String XML_TAG_DATATYPE = "data_type";
    public const String DATATYPE_DROPDOWN = "Dropdown";
    public const String DATATYPE_BOOLEAN = "Boolean";

    public override DataTemplate SelectTemplate(object item,
      DependencyObject container)
    {
        FrameworkElement window = (container as FrameworkElement);
        try
        {                 
            XmlNode node = (XmlNode)item;
            String dataType = "";
            if (node.Attributes[XML_TAG_DATATYPE] != null)
            {
                dataType = (string)node.Attributes.GetNamedItem(XML_TAG_DATATYPE).Value;
            }
            if (dataType == DATATYPE_DROPDOWN)
            {

                return window.FindResource("dropDownTemplate") as DataTemplate; 
            }
            if (dataType == DATATYPE_BOOLEAN)
            {
                return window.FindResource("booldropDownTemplate") as DataTemplate; 
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Select template Exception" + ex.Message ); 
        }
        return window.FindResource("textTemplate") as DataTemplate;
    }
 }

public class boolConverter : IValueConverter
{
    public const String XML_TAG_VALUE = "value";
    public const String XML_TAG_ID = "id";

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Boolean boolVal = false;
        try
        {
            boolVal = System.Convert.ToBoolean(value);
        }
        catch
        {
            string strVal = value.ToString();
            int iVal = int.Parse(strVal);
            boolVal = System.Convert.ToBoolean(iVal);
        }

        if (boolVal == true)
        {
            return 1;
        }
        else
        {
            return 0;
        }


    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {           
        Boolean boolVal = false;
        try
        {
            boolVal = System.Convert.ToBoolean(value);
        }
        catch
        {
            string strVal = value.ToString();
            int iVal = int.Parse(strVal);
            boolVal = System.Convert.ToBoolean(iVal);
        }
        return boolVal;

    }
}

public class SortableGridViewColumn : GridViewColumn
{
    public string SortPropertyName
    {
        get { return (string)GetValue(SortPropertyNameProperty); }
        set { SetValue(SortPropertyNameProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SortPropertyName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SortPropertyNameProperty =
        DependencyProperty.Register("SortPropertyName", typeof(string), 
        typeof(SortableGridViewColumn), new UIPropertyMetadata(""));

    public bool IsDefaultSortColumn
    {
        get { return (bool)GetValue(IsDefaultSortColumnProperty); }
        set { SetValue(IsDefaultSortColumnProperty, value); }
    }
    public static readonly DependencyProperty IsDefaultSortColumnProperty =
        DependencyProperty.Register("IsDefaultSortColumn", typeof(bool), 
        typeof(SortableGridViewColumn), new UIPropertyMetadata(false));
}


public class SortableListView : ListView
{
    public SortableListView()
    {
        // add the event handler to the GridViewColumnHeader. This strongly ties this ListView to a GridView.
        this.AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(GridViewColumnHeaderClickedHandler));
    }     

   SortableGridViewColumn lastSortedOnColumn = null;
   ListSortDirection lastDirection = ListSortDirection.Ascending;

    public void Sort(string sortBy,  ListSortDirection direction)
    {

        ICollectionView dataView = CollectionViewSource.GetDefaultView
           (this.ItemsSource);

        //Check if dataView isn't null
        if (dataView != null)
        {                
            dataView.SortDescriptions.Clear();

            SortDescription sd1 = new SortDescription("@isenabled", direction);
            dataView.SortDescriptions.Add(sd1);

            SortDescription sd = new SortDescription(sortBy, direction);
            dataView.SortDescriptions.Add(sd);                                           

            dataView.Refresh();
        }

    }


    private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
    {
        GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;

        if (headerClicked != null &&
            headerClicked.Role != GridViewColumnHeaderRole.Padding)
        {
             // attempt to cast to the sortableGridViewColumn object.
            SortableGridViewColumn sortableGridViewColumn = (headerClicked.Column) as SortableGridViewColumn;

            // ensure that the column header is the correct type and a sort property has been set.
            if (sortableGridViewColumn != null && !String.IsNullOrEmpty(sortableGridViewColumn.SortPropertyName))
            {

                ListSortDirection direction;                   

                // determine if this is a new sort, or a switch in sort direction.
                if (lastSortedOnColumn == null
                    || String.IsNullOrEmpty(lastSortedOnColumn.SortPropertyName)
                    || !String.Equals(sortableGridViewColumn.SortPropertyName, lastSortedOnColumn.SortPropertyName, StringComparison.InvariantCultureIgnoreCase))
                {                        
                    direction = ListSortDirection.Descending;
                }
                else
                {
                    if (lastDirection == ListSortDirection.Ascending)
                    {
                        direction = ListSortDirection.Descending;
                    }
                    else
                    {
                        direction = ListSortDirection.Ascending;
                    }
                }

                // get the sort property name from the column's information.
                string sortPropertyName = sortableGridViewColumn.SortPropertyName;

                // Sort the data.
                Sort(sortPropertyName, direction);

                lastSortedOnColumn = sortableGridViewColumn;
                lastDirection = direction;
            }
        }
    }       
}

public class SortList : IValueConverter
{     
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {     
        //If the value is null tell binding engine to do nothing
        if (value == null)
        {
            return Binding.DoNothing;  
        }

        ListCollectionView view = (ListCollectionView)
           CollectionViewSource.GetDefaultView(value);


        SortDescription sort_isdisabled =
            new SortDescription("@isenabled",
                ListSortDirection.Ascending);

        view.SortDescriptions.Add(sort_isdisabled);

        SortDescription sort_id =
            new SortDescription("@id",
                ListSortDirection.Ascending);

        view.SortDescriptions.Add(sort_id);

        return view;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
        <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

    <DataTemplate x:Key="textTemplate">
        <TextBox  HorizontalAlignment= "Stretch" 
    IsEnabled="{Binding XPath=./@isenabled}"        
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    GotFocus="txtBoxGotFocus"
    Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <Binding XPath="./@value" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>           
                        <local:TextBoxMinMaxValidation>
            <local:TextBoxMinMaxValidation.DataType>
                          <local:DataTypeCheck 
                                Datatype="{Binding Source={StaticResource dataProvider}, XPath='/[@id=CustomerServiceQueueName]'}"/>
                        </local:TextBoxMinMaxValidation.DataType>              
                         <local:TextBoxMinMaxValidation.ValidRange>
            <local:Int32RangeChecker 
                                Minimum="{Binding Source={StaticResource dataProvider}, XPath=./@min}" 
                                Maximum="{Binding Source={StaticResource dataProvider}, XPath=./@max}"/>                                            
             </local:TextBoxMinMaxValidation.ValidRange>
                        </local:TextBoxMinMaxValidation>
                    </Binding.ValidationRules> 
                </Binding >
            </TextBox.Text> 
        </TextBox>
    </DataTemplate>
    <DataTemplate x:Key="dropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value}"
           ItemsSource="{Binding XPath=.//OPTION/@value}"
           IsEnabled="{Binding XPath=./@isenabled}"
         />
    </DataTemplate>
<DataTemplate x:Key="booldropDownTemplate">
        <ComboBox  Name="cmbBox" HorizontalAlignment="Stretch"
           SelectedIndex="{Binding XPath=./@value,  Converter={StaticResource boolconvert}}">
            <ComboBoxItem>True</ComboBoxItem>
            <ComboBoxItem>False</ComboBoxItem>                                         
        </ComboBox>
    </DataTemplate>
    <local:ControlTemplateSelector 
        x:Key="myControlTemplateSelector"/>

    <Style x:Key="StretchedContainerStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="Template" Value="{DynamicResource ListBoxItemControlTemplate1}"/>
    </Style>
    <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
        <Border SnapsToDevicePixels="true" x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Padding="{TemplateBinding Padding}" BorderThickness="0,0.5,0,0.5">
            <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>            
    </ControlTemplate>


    <Style x:Key="CustomHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="LightGray" />            
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="Padding" Value="2,0,2,0"/>                 
    </Style>

</UserControl.Resources>
<Grid x:Name="GridViewControl" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="34"/>
    </Grid.RowDefinitions>

    <ListView x:Name="ListViewControl" Grid.Row="0"   ItemContainerStyle="{DynamicResource StretchedContainerStyle}" 
    ItemTemplateSelector="{DynamicResource myControlTemplateSelector}" 
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding Source={StaticResource dataProvider}, 
    XPath=//CONFIGURATION}">           

        <ListView.View >
            <GridView >                    
                <GridViewColumn  Header="ID" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@id}"/>
                <GridViewColumn  Header="VALUE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" CellTemplateSelector="{DynamicResource myControlTemplateSelector}" />
                <GridViewColumn  Header="DATATYPE" HeaderContainerStyle="{StaticResource CustomHeaderStyle}" DisplayMemberBinding="{Binding XPath=./@data_type}"/>
                <GridViewColumn  Header="DESCRIPTION" HeaderContainerStyle="{StaticResource CustomHeaderStyle}"  
        DisplayMemberBinding="{Binding XPath=./@description}" 
        Width="{Binding ElementName=ListViewControl, Path=ActualWidth}"/>


            </GridView>
        </ListView.View>

    </ListView>
    <StackPanel Grid.Row="1">
        <Button Grid.Row="1" HorizontalAlignment="Stretch"  Height="34" HorizontalContentAlignment="Stretch" >
            <StackPanel  HorizontalAlignment="Stretch"  VerticalAlignment="Center"  Orientation="Horizontal"  FlowDirection="RightToLeft" Height="30">
                <Button  Grid.Row="1" Content ="Apply" Padding="0,0,0,0 " Margin="6,2,0,2" Name="btn_Apply" HorizontalAlignment="Right"  VerticalContentAlignment="Center"   HorizontalContentAlignment="Center" Width="132"  IsTabStop="True" Click="btn_ApplyClick"  Height="24" />
            </StackPanel >
        </Button> 
    </StackPanel >

</Grid>    
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用System.Xml;
使用系统线程;
使用System.Collections.ObjectModel;
名称空间…杂项设置
{
/// 
///ConfigDataView.xaml的交互逻辑
/// 
公共部分类ConfigDataView:UserControl、IConfigDataViewControl
{
ConfigDataViewPresenter _presenter=null;
公共静态字符串_currDataType=“”;
公共静态字符串_min=“”;
公共静态字符串_max=“”;
公共字符串最小值
{
得到
{
返回_min;
}
设置
{
_最小值=数值;
}
}
公共字符串最大值
{
得到
{
返回_max;
}
设置
{
_最大值=最大值;
}
}
公共字符串数据类型
{
得到
{
返回数据类型;
}
设置
{
_currDataType=值;
}
}
公共ConfigDataView()
{            
初始化组件();
//给人以经典的windows外观
Uri=新Uri(“PresentationFramework.Classic;V3.0.0.0;31bf3856ad364e35;component\\themes/Classic.xaml”,UriKind.Relative);
Add(Application.LoadComponent(uri)作为ResourceDictionary);
}
私有void txtBoxGotFocus(对象发送方,路由目标)
{
Min=“”;
Max=“”;
TextBox txtbox=e.来源为TextBox;
this.ListViewControl.SelectedItem=txtbox.DataContext;
//索引
int index=this.ListViewControl.Items.IndexOf(this.ListViewControl.SelectedItem);
System.ComponentModel.ICollectionView数据视图=CollectionViewSource.GetDefaultView(this.ListViewControl.ItemsSource);
对象stCurr=(dataView.CurrentPosition);
//检查“数据类型”属性是否存在
if(((xmlement)dataView.CurrentItem).Attributes[“数据类型”!=null)
{
CurrDataType=((XmlElement)dataView.CurrentItem).Attributes[“数据类型]]值;
}
//检查“min”属性是否存在
if(((xmlement)dataView.CurrentItem).Attributes[“min”!=null)
{
Min=((xmlement)dataView.CurrentItem).Attributes[“Min”].Value;
}
//检查“min”属性是否存在
if(((xmlement)dataView.CurrentItem).Attributes[“max”!=null)
{
Max=((xmlement)dataView.CurrentItem).Attributes[“Max”].Value;
}
}
#区域IConfigDataViewControl成员
public void LoadRootConfigData(字符串xmlFileName、字符串xmlFileContent、字符串xmlXPath)
{
尝试
{
XmlDocument configFileDoc=新的XmlDocument();
configFileDoc.LoadXml(xmlFileContent);
XmlDataProvider xmldp=(XmlDataProvider)this.TryFindResource(“数据提供者”);
xmldp.Document=configFileDoc;
if(string.IsNullOrEmpty(xmlXPath))
{
xmldp.XPath=@”//node()[1]/node()[@value]”;
}
其他的
{
xmldp.XPath=xmlXPath;
}
Binding bnd=新绑定();
bnd.Source=xmldp;
bnd.Converter=new SortList();
ListViewControl.SetBinding(ItemsControl.ItemsSourceProperty,bnd);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
public void LoadCategoryConfigData(字符串xmlFile、字符串xmlFileContent、字符串CategoryNodeName)
{
尝试
{                
XmlDocument configFileDoc=新的XmlDocument();
configFileDoc.LoadXml(xmlFileContent);
XmlDataProvider xmldp=(XmlDataProvider)this.TryFindResource(“数据提供者”);
xmldp.Document=configFileDoc;
xmldp.XPath=@”//CONTEXT[@id='“+CategoryNodeName+@']/CONFIGURATION”;
Binding bnd=新绑定();
bnd.Source=xmldp;