(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}" >
的列创建可重用的ControlTemplate
,TemplateColumn
或Style
路径,所以没有人似乎没有提供如何做到这一点的答案。一个常见的建议是尝试DataGrid
,但绑定不能正常工作。
当然,除了复制/粘贴每个列的上述代码之外,还有一个更好的方法,然后更改绑定路径?在我看来,这完全是荒谬的,并且面对我所学过的关于编码冗余概念的所有内容......如果您的列数是数十,甚至数百?目前这是对AttachedProperty
的可约性的严重限制......我必须在这里遗漏一些东西。
答案 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" />