#wpf #xaml #binding #ivalueconverter
#wpf #xaml #привязка #ivalueconverter
Вопрос:
У меня есть класс с именем CarSystemWindow, который происходит из Window, и он имеет свойство логической зависимости CanPinWindow:
public class CarSystemWindow : Window {
public static readonly DependencyProperty CanPinWindowProperty =
DependencyProperty.Register( "CanPinWindow", typeof( bool ), typeof( CarSystemWindow ),
new FrameworkPropertyMetadata( false, FrameworkPropertyMetadataOptions.AffectsArrange ) );
public bool CanPinWindow {
get { return (bool) GetValue( CanPinWindowProperty ); }
set { SetValue( CanPinWindowProperty, value ); }
}
. . .
}
В Generic.xaml я определил стиль по умолчанию для класса CarSystemWindow:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CarSystem.CustomControls"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:Telerik_Windows_Controls_Chromes="clr-namespace:Telerik.Windows.Controls.Chromes;assembly=Telerik.Windows.Controls">
<BooleanToVisibilityConverter x:Key="BoolToVisbility" />
<Style TargetType="{x:Type local:CarSystemWindow}">
<Setter Property="WindowState" Value="Maximized" />
<Setter Property="WindowStyle" Value="None" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CarSystemWindow}">
<Viewbox Name="LayoutRoot" Stretch="Uniform">
<StackPanel>
<Grid Background="#FF3C4B66" Height="50" Name="PART_Title">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="50" />
<ColumnDefinition Width="50" />
</Grid.ColumnDefinitions>
<Label Content="{TemplateBinding Title}"
FontSize="32"
Foreground="White"
Grid.Column="0"
HorizontalAlignment="Left"
Name="PART_TitleLabel" />
<Button Grid.Column="1"
Margin="5"
Name="PART_PushpinButton"
Visibility="{Binding CanPinWindow, Converter={StaticResource BoolToVisbility}, RelativeSource={RelativeSource Self}}">
<Image Name="PART_PushpinImage" Source="/CarSystem;component/Resources/Unpinned.png" />
</Button>
<Button Grid.Column="2"
Margin="5"
Name="PART_MinimizeButton">
<Image Name="PART_MinimizeButtonImage" Source="/CarSystem;component/Resources/Minimize.png" />
</Button>
<Button Grid.Column="3"
Margin="5"
Name="PART_CloseButton">
<Image Name="PART_CloseButtonImage" Source="/CarSystem;component/Resources/Close.png" />
</Button>
</Grid>
<Rectangle Fill="#FFE61E0F" Height="4" Name="PART_TitleBar" />
<Grid Background="#FF3C4B66" Height="25" Name="PART_SubTitle">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{TemplateBinding DeviceType}"
FontSize="22"
Foreground="White"
Grid.Column="0"
HorizontalContentAlignment="Right"
Margin="5"
MinWidth="75"
Name="PART_DeviceTypeLabel" />
<Label Content="{TemplateBinding DeviceName}"
FontSize="22"
Foreground="White"
Grid.Column="1"
HorizontalContentAlignment="Left"
Margin="5"
MinWidth="250"
Name="PART_DeviceNameLabel" />
<Rectangle Fill="White" Grid.Column="2" Name="PART_SubTitleRight" />
</Grid>
<Rectangle Fill="#FF3C4B66" Height="4" Name="PART_TitleBottom" />
<ContentPresenter Name="PART_ClientArea" />
</StackPanel>
</Viewbox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
. . .
</ResourceDictionary>
Привязка к свойству видимости кнопки PART_PushpinButton не работает. Кнопка всегда видна, даже если свойство по умолчанию равно false . Что я делаю не так?
Тони
Ответ №1:
Я думаю RelativeSource
, что должно быть TemplatedParent
, а не Self
. Или я пропустил какую-то часть вашего кода?
<Button Grid.Column="1"
Margin="5"
Name="PART_PushpinButton"
Visibility="{Binding CanPinWindow, Converter= {StaticResource BoolToVisbility}, RelativeSource={RelativeSource TemplatedParent}}">