Как я могу изменить свойство элемента на основе свойства объекта INotifyPropertyChanged в ObservableCollection? - PullRequest
1 голос
/ 12 ноября 2010

У меня есть ObservableCollection<User> полный пользовательских объектов, которые реализуют INotifyPropertyChanged. Коллекция установлена ​​как DataContext моего Окна, которая содержит ListBox (чья ItemsSource также установлена ​​в той же коллекции), число TextBox es и сохранение Button, стандартный CRUD установка.

Я хочу изменить фон кнопки «Сохранить» (и фон строки в ListBox, которая соответствует «текущему элементу»), если изменяется одно из свойств объектов User. Должен ли я смотреть на стили и триггеры?

У меня есть следующий стиль, примененный к моей кнопке сохранения, а объекты User имеют свойство public bool IsDirty.

<Style x:Key="PropertyChangedStyle" TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Source=???, Path=IsDirty}" Value="True">
            <Setter Property="Background" Value="Red" />
        </DataTrigger>
    </Style.Triggers>
</Style>

<Button ... Style="{StaticResource PropertyChangedStyle}">

Я думаю, что я на правильном пути, но я не понимаю, как указать привязку к «текущему элементу в наблюдаемом списке, который установлен как текстовый текст», где «текущий элемент» в этом случае описывается CollectionViewSource.GetDefaultView(ListOfUsers).CurrentItem (где ListOfUsers - мой ObservableCollection<User>).

Ответы [ 2 ]

0 голосов
/ 13 ноября 2010

WPF поддерживает идею «текущего элемента» в коллекции и будет отслеживать текущий элемент для вас.Вы можете написать путь привязки, который ссылается на текущий элемент коллекции.

См. Раздел «Указатели текущего элемента» на странице Обзор привязки данных в MSDN.

IЯ думаю, что если ваш ItemSource ListBox связан (например) {Binding ListOfUsers}, то ваша кнопка может использовать {Binding ListOfUsers/IsDirty}.

Я не использовал это много, но я думаю, что вам, возможно, придетсяустановите свойство IsBynchronizedWithCurrentItem в ListBox на True, чтобы эта работа работала.

0 голосов
/ 13 ноября 2010

DataContext каждого из элементов в вашем ListBox будет автоматически привязан к вашим User экземплярам, ​​поэтому нет необходимости устанавливать источник в вашей привязке. Вы можете напрямую привязать стиль ваших ListBoxItem s к свойствам в ваших User экземплярах.

Вы можете достичь этого следующим образом:

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="ASD_Answer011.MainWindow"
        x:Name="Window"
        Title="MainWindow"
        Width="640" Height="480">
        <Window.Resources>
            <DataTemplate x:Key="ItemTemplate">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Property1}"/>
                    <CheckBox IsChecked="{Binding Property2}"/>
                </StackPanel>
            </DataTemplate>
            <Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsDirty}" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
                <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                <Setter Property="Padding" Value="2,0,0,0"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="true">
                                    <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsSelected" Value="true"/>
                                        <Condition Property="Selector.IsSelectionActive" Value="false"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                                </MultiTrigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>

        <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
            <ListBox ItemTemplate="{DynamicResource ItemTemplate}" ItemsSource="{Binding Collection}" ItemContainerStyle="{DynamicResource ListBoxItemStyle1}"/>
        </Grid>
    </Window>

Вот как это выглядит при запуске приложения:

DataTrigger Binding Example

...