dot*_*NET 2 wpf xaml binding datatemplate mvvm
所以我TabControl在运行时直接将我的视图添加到'items集合中(而不是围绕它们创建TabItems并将这些TabItems添加到TabControl).这些视图公开了一个属性(名称相同的ViewModel属性的包装)HasChanges,我希望将其绑定到TabItem标题,以显示一个Asterisk(*)符号来标识带有未保存更改的选项卡,就像VS一样.我已经尝试过使用DataTemplates但是在访问视图对象时遇到了问题DataTemplate.这样做的正确方法是什么?这是我的几次尝试之一:
<TabControl.ItemTemplate>
<DataTemplate DataType="UserControl">
<StackPanel Orientation="Horizontal" Margin="0" Height="22">
<TextBlock VerticalAlignment="Center" Text="{Binding HeaderText, RelativeSource={RelativeSource AncestorType=UserControl}}" />
<TextBlock Text="*" Visibility="{Binding HasChanges, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource B2VConverter}}" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
请注意,我正在为两个TextBlocks 尝试两种不同的绑定方法,其中没有一种是有效的.我的视图继承UserControl并公开属性HasChanges和HeaderText.
好.我自己解决了.对于其他任何试图实现类似VS的关闭按钮和未保存的更改星号的人,这里是模板:
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="HeaderTemplate" >
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0" Height="22">
<TextBlock VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType=TabItem}, Path=Content.HeaderText}" />
<TextBlock Text=" *" ToolTip="Has unsaved changes" Visibility="{Binding Content.DataContext.HasChanges, RelativeSource={RelativeSource AncestorType=TabItem}, Converter={StaticResource B2VConverter}}" />
<Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Width="18" Height="18"
Margin="6,0,0,0" Padding="0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center"
Command="{Binding DataContext.TabClosingCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"
VerticalAlignment="Center" Focusable="False">
<Grid Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Line StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Stroke="Gray" X1="1" Y1="1" X2="9" Y2="9" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Line StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Stroke="Gray" X1="1" Y1="9" X2="9" Y2="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</Button>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)
结果是一个优雅的基于绘图的按钮,具有平面外观.您的View必须实现布尔HasChanges和HeaderText属性,另外您需要BooleanToVisibilityConverter在资源部分中定义名为B2VConverter的a.