2010-11-12 127 views
1

我有一個ObservableCollection<User>完整的用戶對象,實現INotifyPropertyChanged。該集合被設置爲我的窗口的DataContext,其中包含ListBox(其ItemsSource也設置爲相同的集合),TextBox es以及標準CRUD設置的保存Button如何根據ObservableCollection中的INotifyPropertyChanged對象的屬性更改元素的屬性?

如果User對象的某個屬性發生更改,我想更改save Button的背景(以及ListBox中與「當前項目」對應的行的背景)。我應該看樣式和觸發器嗎?

我有以下樣式應用於我的保存按鈕,並且用戶對象具有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}"> 

我覺得我在正確的軌道上,但我不知道如何點結合「可觀察列表中的當前項目被設置爲在DataContext」,其中「當前項目」在這種情況下由CollectionViewSource.GetDefaultView(ListOfUsers).CurrentItem(其中ListOfUsers是我的ObservableCollection<User>)進行描述。

回答

0

您列表框中每個項目的DataContext將自動綁定到您的User實例,因此沒有必要在綁定中設置源。您可以直接將ListBoxItem的樣式綁定到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

+0

S如何使用綁定來更改「髒」物品的背景? – epalm 2010-11-12 21:40:45

+0

我已經用一個如何實現你所需要的行爲的例子更新了我的答案。 – Murven 2010-11-14 06:04:50

0

WPF支持「當前項目」的想法,在一個收集,並將爲您追蹤當前項目。您可以編寫一個引用集合當前項目的綁定路徑。

請參閱MSDN上Data Binding Overview頁面上的「當前項目指針」部分。

我在想,如果你的ListBox的ItemsSource綁定到(例如){Binding ListOfUsers},那麼你的按鈕可以使用{Binding ListOfUsers/IsDirty}

我還沒有使用過這麼多,但我認爲你可能必須將你的ListBox的IsSynchronizedWithCurrentItem屬性設置爲True來使這個工作。

相關問題