小编Thi*_*ult的帖子

WPF DataGrid单元格字符串格式作为样式或模板

我尝试了几种方法来分解WPF DataGrid中的单元格格式(.NET 4提供的格式):

  • 一个数据转换器,
  • 样式中的"StringFormat"绑定属性,
  • 数据模板中的"StringFormat"绑定属性.

我将描述我的尝试,因为它可能会帮助其他人,我希望有人可以给我建议,以改善这些解决方案.请注意,我对WPF相当新...

预期的行为是将单元格字符串格式化为特定类似"1,234,567"的内容以进行显示,但在编辑单元格时应将其格式化为"1234567"(其默认格式).当我尝试使用数据转换器时,我没有找到在编辑时使用默认格式的方法,因此我将精力集中在样式和模板上.

使用样式,DataGridTextColumn的定义如下:

<DataGridTextColumn Header="Price (Style)" SortMemberPath="BILL_PRICE">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Text" Value="{Binding Path=BILL_PRICE, StringFormat={}{0:N0}}"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
    <DataGridTextColumn.EditingElementStyle>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Text" Value="{Binding Path=BILL_PRICE}"/>
            <Setter Property="Padding" Value="0"/>
            <Setter Property="BorderThickness" Value="0"/>
        </Style>
    </DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

行为正是预期的.但是,由于绑定,我无法分解这种风格并多次使用它.为了解决分解问题,我使用了DataGridTemplateColumn和数据模板.这是我的DataGridTemplateColumn定义:

<DataGridTemplateColumn Header="Price (Template)" SortMemberPath="BILL_PRICE">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding BILL_PRICE}" Template="{StaticResource CurrencyCellControlTemplate}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding BILL_PRICE, Mode=TwoWay}" Template="{StaticResource CurrencyCellEditingControlTemplate}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

和ControlTemplate定义:

<ControlTemplate x:Key="CurrencyCellControlTemplate" TargetType="ContentControl">
    <TextBlock Margin="2,0,2,0" Padding="0" TextAlignment="Right">
        <TextBlock.Text>
            <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content" StringFormat="{}{0:N0}"/> …
Run Code Online (Sandbox Code Playgroud)

wpf datagrid string-formatting datagridtemplatecolumn datagridtextcolumn

8
推荐指数
1
解决办法
1万
查看次数

.NET 4控制没有Blend的默认模板

当人们无法使用Expression Blend时,人们如何找到.NET控件的默认模板?

到目前为止,当我需要WPF控件的模板时,我访问了Codeplex上的WPF项目页面,浏览了源代码,并且通常在"Generic.xaml"文件中找到了默认模板.

但现在我正在寻找"Frame"控件的默认模板.我在Codeplex上找不到它,我也没有在MS提供的.NET框架源中看到它(没有提供XAML文件,只有.cs文件).

Style Snooper工具提供了一个默认模板,但它似乎是逆向工程(不必要的冗长和引用内部类)而不是原始的清晰定义.

那么,穷人如何获得这些模板呢?

.net wpf datatemplate

6
推荐指数
1
解决办法
1140
查看次数