WPF / XAML: переключение стиля на основе пользовательского свойства - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть пользовательский элемент управления WPF со следующим xaml

<UserControl x:Class="Scheduler.ItemBox"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="40" d:DesignWidth="150" MinHeight="40" MinWidth="75" VerticalAlignment="Top">
 <Border BorderBrush="CornflowerBlue" BorderThickness="1" CornerRadius="5" Name="border">
     <Border.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="White" Offset="0"/>
            <GradientStop Color="#FFC0D3EA" Offset="1"/>
        </LinearGradientBrush>
    </Border.Background>
    <Grid Margin="2,0" Name="grid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="20" MaxHeight="20" MinHeight="20" />
            <RowDefinition MinHeight="20" />
        </Grid.RowDefinitions>
        <Label Content="00:00" FontWeight="Bold" Name="FromTime" Padding="5,0,0,0" VerticalContentAlignment="Center" />
        <Label Content="01:30" Grid.Column="1" HorizontalContentAlignment="Right" Name="ToTime" Padding="0,0,5,0" VerticalContentAlignment="Center" />
        <TextBlock Grid.ColumnSpan="2" Grid.Row="1" Name="MovieTitle" Padding="5,0" Text="item1" TextWrapping="Wrap" />
    </Grid>
</Border>

И класс пользовательского элемента управления выглядит следующим образом

Namespace Scheduler
Public Class ItemBox

    Public Property Selected As Boolean

End Class

Конечное пространство имен

Теперь я хотел бы, чтобы при изменении свойства Selected на True было следующее: - установить для border borderbrush черный цвет - установить для borderthickness 2 значение - установить для поля сетки значение 1

Я хотел бычтобы достичь этого, определив «выбранный» стиль в пользовательском контроле, который переопределяет стили по умолчанию, когда для выбранного свойства установлено значение «Истина».

Я знаю, что это как-то связано с триггером стиля и определением пользовательского присоединенного свойства.,Но я не могу заставить его работать так, как я хочу.

1 Ответ

0 голосов
/ 04 марта 2011

Первая проблема - ваше выбранное свойство не является "наблюдаемым". Это означает, что все, что наблюдает за изменением свойства (например, триггер стиля или привязка), никогда не будет уведомлено о его изменении.

Вам нужно будет либо реализовать INotifyPropertyChanged , либо сделать ваше свойство Свойство зависимости . Это не обязательно должно быть присоединенное свойство, так как при необходимости вы можете связать его с помощью RelativeSource.

Вторая проблема заключается в том, что ваш UserControl не имеет стиля, по крайней мере, по умолчанию. Даже если вы установите свойство UserControl.Style, вы не сможете легко изменить содержимое. Это проще сделать с помощью пользовательского элемента управления , и это ваш лучший выбор для достижения желаемого.

...