需要可重用的DataCell ControlTemplate用于不同的绑定源

时间:2013-08-07 13:59:24

标签: wpf binding datagrid styles

(Visual Studio 2010)从Web示例中,我覆盖了ControlTemplate的{​​{1}}以包含绑定到ViewModel的其他图像。

DatagridTextColumn

感兴趣的线靠近底部: <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="DataGridCell"> <Grid Name="Root" Background="{TemplateBinding Background}"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CurrentStates"> <VisualState x:Name="Regular" /> <VisualState x:Name="Current"> <Storyboard> <DoubleAnimation Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Opacity" To="1" Duration="0" /> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup x:Name="ValidationStates"> <VisualState x:Name="Valid"/> <VisualState x:Name="Invalid"> <Storyboard> <DoubleAnimation Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> <ColorAnimation Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="(Fill).Color" Duration="0" To="#FFFFFFFF"/> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Rectangle Name="FocusVisual" Stroke="#FF6DBDD1" StrokeThickness="1" Fill="#66FFFFFF" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" /> <ContentPresenter ContentSource="Content" /> <Image Source="{Binding someProperty}" Grid.Column="1"/> <Rectangle x:Name="InvalidVisualElement" IsHitTestVisible="False" StrokeThickness="1" Stroke="#FFDC000C" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0"/> <Rectangle Name="RightGridLine" Grid.Column="1" VerticalAlignment="Stretch" Width="1" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </DataGridTextColumn.CellStyle> 。我希望能够在应用程序中的多个位置重用此<Image Source="{Binding someProperty}" Grid.Column="1"/>。唯一的区别是ControlTemplate本身的绑定路径和添加的Column。理想情况下,我可以声明一个Image并声明这种样式并使用最少的附加代码指示绑定:

TextColumn

我遇到了多个用户帖子,询问如何使用不同的绑定为<DataGridTextColumn Binding="{Binding typicalProperty}" CellStyle="myStyle" [this part can't do -->] ImageSourceBinding="{Binding anyPropertyInViewModel}" > 的列创建可重用的ControlTemplateTemplateColumnStyle路径,所以没有人似乎没有提供如何做到这一点的答案。一个常见的建议是尝试DataGrid,但绑定不能正常工作。

当然,除了复制/粘贴每个列的上述代码之外,还有一个更好的方法,然后更改绑定路径?在我看来,这完全是荒谬的,并且面对我所学过的关于编码冗余概念的所有内容......如果您的列数是数十,甚至数百?目前这是对AttachedProperty的可约性的严重限制......我必须在这里遗漏一些东西。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要添加数据类属性,例如 - AnotherTextValue。例如,我们有一个班级MyObject

public class MyObject
{
    public string BaseValue
    {
        get; 
        set; 
    }

    // value for TextBlock in DataGridCell
    public string AnotherTextValue 
    {
        get; 
        set;
    }
}
本课程的

ObservableCollection

public ObservableCollection<MyObject> Objects 
{
    get; 
    set; 
}

DataGridCell的样式最适合放置窗口资源(Window.Resources)或App.xaml

<Window.Resources>
    <Style x:Key="MyCellStyle" TargetType="{x:Type DataGridCell}">
        ...
    </Style>
</Window.Resources>
TextBlock样式中的

DataGridCell将如下所示:

...
<ContentPresenter ContentSource="Content" />

<TextBlock Text="{Binding AnotherTextValue}" Grid.Column="1" />

定义DataGridTextColumn

<DataGridTextColumn CellStyle="{StaticResource MyCellStyle}" Binding="{Binding BaseValue}" Header="My Super Header" />