2

使用 VS 2010 我计划制作几个 datagrid 模板列,但它们都将包含一个文本块,我希望它们在排序、过滤、编辑等方面表现得像一个文本列(例如,一个具有文本块和堆栈面板中的图像,但从行为角度来看,它应该是关于文本的。)

使用模板列时,我了解到与普通文本单元格相关的大部分功能必须重做。例如,为了使文本可编辑,必须提供一个单元格编辑模板,例如:

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox
        FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
        Text="{Binding Path=SomeProperty, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
            </TextBox>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

并且您还必须处理网格事件以确保它的行为类似于普通文本框,例如如果用户按下某个键或单元格的制表符等自动开始编辑模式等)

所以我的问题是,对于我这样创建的每个模板列,避免显式编写此代码(以及用于排序、复制、过滤等的代码,如文本单元格)的最佳方法是什么(如果有的话) ? 我假设为每一列复制半页的代码是不好的做法,其中唯一的区别可能是绑定的属性名称和一些视觉更改。

我对此感到非常沮丧,总体上对 WPF 也是如此。我搜索了网络,尝试了装饰器,尝试了继承数据网格列,尝试为数据模板定义用户控件,但一切似乎都因一些讨厌的“陷阱”而失败。这是关于我提出的第三个问题,其中有不同的细节,但反应很少。弄清楚如何实现基本上是美化的文本列应该这么难,而不需要每次都在每个方面都重新发明整个轮子。至少在我的拙见中。

4

2 回答 2

1

你能告诉我如何使用单元格样式来修改现有的 DataGridTextColumn 以便它显示文本以及旁边的图像吗?

这里:

 <DataGridTextColumn Binding="{Binding LastName}">
     <DataGridTextColumn.CellStyle>
         <Style TargetType="DataGridCell">
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="DataGridCell">
                         <Grid>
                             <Grid.ColumnDefinitions>
                                 <ColumnDefinition/>
                                 <ColumnDefinition Width="16"/>
                             </Grid.ColumnDefinitions>

                             <ContentPresenter ContentSource="Content"/>
                             <Image Source="/Images/Homer.jpg" Grid.Column="1"/>
                        </Grid>
                     </ControlTemplate>
                 </Setter.Value>
             </Setter>
         </Style>
     </DataGridTextColumn.CellStyle>
</DataGridTextColumn>

通过更多的工作,您可以像Resources在应用程序中一样定义这些模板和样式,并且每次都可以重用它们。

关于图像源,您可以使用 anAttached Property来定义它DataGridTextColumn,甚至是Tag属性。

编辑:带有附加属性的示例:

 <DataGrid ...>
            <DataGrid.Resources>
                <ControlTemplate TargetType="DataGridCell" x:Key="TextAndImageDataGridCellTemplate">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="16"/>
                        </Grid.ColumnDefinitions>

                        <ContentPresenter ContentSource="Content"/>
                        <Image Source="{Binding Column.(local:GridColumnProperties.ImageSource), RelativeSource={RelativeSource TemplatedParent}}" Grid.Column="1"/>
                    </Grid>
                </ControlTemplate>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding LastName}"
                                    local:GridColumnProperties.ImageSource="/Images/Homer.jpg">
                    <DataGridTextColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="Template" Value="{StaticResource TextAndImageDataGridCellTemplate}"/>
                        </Style>
                    </DataGridTextColumn.CellStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
    </DataGrid>

代码:

   public static class GridColumnProperties
    {
        public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.RegisterAttached("ImageSource", typeof(ImageSource), typeof(GridColumnProperties), new PropertyMetadata());

        public static void SetImageSource(DependencyObject obj, ImageSource value)
        {
            obj.SetValue(ImageSourceProperty, value);
        }

        public static ImageSource GetImageSource(DependencyObject obj)
        {
            return obj.GetValue(ImageSourceProperty) as ImageSource;
        }
    }
于 2013-07-15T21:07:11.007 回答
-3

创建一个库项目,添加代码和标记,并从项目中引用这个新的 dll。

于 2013-07-15T20:49:22.303 回答