2013-08-27 57 views
1

可能是一個簡單的但我似乎無法得到它的工作,這裏是列表視圖和綁定的XAML;綁定ListViewItem布爾型背景

<ListView 
    VerticalAlignment="Stretch" 
    HorizontalAlignment="Stretch" 
    x:Name="lstTrackers" 
    ItemsSource="{Binding Path=MainWindowViewModel.TrackerCollection}" 
    HorizontalContentAlignment="Stretch"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="True"> 
       <Setter Property="Background" Value="Green"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="False"> 
       <Setter Property="Background" Value="White"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <TextBlock 
      Text="{Binding Path=Description}" 
      x:Name="listTextClick" 
      MouseLeftButtonUp="listTextClick_MouseLeftButtonUp" 
      HorizontalAlignment="Stretch"/> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

和我試圖綁定它的屬性;

public class TrackerViewModel : ViewModelBase 
    { 
     readonly Tracker _tracker; 

     public TrackerViewModel(Tracker tracker) 
     { 
      _tracker = tracker; 
     } 

     public bool LastTransmitted 
    { 
     get 
     { 
      return _tracker.lastTransmitted; 
     } 
     set 
     { 
      _tracker.lastTransmitted = value; 
      OnPropertyChanged("LastTransmitted"); 
     } 
    } 
    } 

然後我只是試圖將布爾值設置爲true,我認爲這會觸發樣式處理;

_trackerViewModel.LastTransmitted = true; 

然而,似乎什麼也沒有發生。有什麼簡單而又迫切需要我失蹤?

注意:我已經嘗試將「true」更改爲「True」,只是incase。

編輯1:似乎沒有通知變化,這是非常奇怪的,因爲我確定它是。如果我將觸發器更改爲;

<Style x:Key="listBoxStyle" TargetType="{x:Type TextBlock}"> 
                <Style.Triggers> 
                 <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="True"> 
                  <Setter Property="Background" Value="Green"/> 
                 </DataTrigger> 
                 <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="False"> 
                 <Setter Property="Background" Value="Blue" ></Setter> 
                </DataTrigger> 
                </Style.Triggers> 
                <!--<Setter Property="Background" Value="Red"/>--> 
               </Style> 

然後textblocks都是藍色的,如布爾值被設置爲true所示。但是,如果設置爲true,並且通知了屬性,則不會更改。也許這個清單不是很好的清爽?我確定它與ObservableCollection相關聯。編輯2:並在那個筆記,事實證明我使用自定義列表; 「ThreadedBindingList」。它可能不會從OnNotify更新..所以我不得不嘗試解決這個問題。

回答

2

您需要提高PropertyChangedEvent的屬性LastTransmitted,以便通知用戶界面該屬性已更改並且您的觸發器已執行。

由於您從ViewModelBase繼承了班級,我假設該班級實施了INotifyPropertyChanged並提供了一種提升活動的方法。

public bool LastTransmitted { 
    get { 
    return _tracker.lastTransmitted; 
    } 
    set { 
    _tracker.lastTransmitted = value; 
    RaisePropertyChanged("LastTransmitted"); 
    } 
} 

UPDATE:

當我明白你的權利,你想要的TextBlock的背景被改變了LastTransmitted屬性發生變化時。 TextBlock本身沒有Background-Property,所​​以你必須把TextBlock放入像GridStackPanel這樣的容器中。

這是您的ListBox的DataTemplate,可以實現您想要的功能。

<DataTemplate> 
    <StackPanel> 
    <StackPanel.Style> 
     <Style TargetType="StackPanel"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="True"> 
      <Setter Property="Background" Value="Green" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=LastTransmitted}" Value="False"> 
      <Setter Property="Background" Value="White" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </StackPanel.Style> 
    <TextBlock HorizontalAlignment="Stretch" Text="{Binding Path=Description}" /> 
    </StackPanel> 
</DataTemplate> 
+0

我希望你能看到我的viewmodel的其餘部分,我字面上每次提高屬性更改。每一次,但這次,XD是多麼愚蠢的錯誤,說我已經添加了屬性發生了變化,而且似乎還沒有發生。 –

+0

仍然沒有用,我很害怕。我試圖將樣式應用於文本塊,應該以不同的方式完成嗎?作爲風格的目標目標ListViewItem –

+0

@ Shane.C我改變了我的答案。看看它。 – Jehof

0

XAML不知道您已經更新了該值,除非您告訴它。您需要property change notification

讓您的班級執行INotifyPropertyChanged並定義PropertyChanged事件處理程序。然後,無論何時您需要關注XAML的某些事情,請使用您更改的屬性名稱發起PropertyChanged事件。

public class TrackerViewModel : ViewModelBase, INotifyPropertyChanged 
{ 
    readonly Tracker _tracker; 

    public TrackerViewModel(Tracker tracker) 
    { 
     _tracker = tracker; 
    } 

    public bool LastTransmitted 
    { 
     get 
     { 
      return _tracker.lastTransmitted; 
     } 
     set 
     { 
      _tracker.lastTransmitted = value; 
      OnPropertyChanged("LastTransmitted"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string name) 
    { 
     var handler = PropertyChanged; 
     if(handler != null) handler(this, new PropertyChangedEventArgs(name)); 
    } 
} 
+0

Jehof第一次進來,他應該得到信用;-) – josh2112

+0

我只是忘了添加propertyChanged事件,但在這樣做後,我仍然沒有看到任何結果!我已更新我的代碼 –

+0

如何設置DataContext?因爲您已經使用了'ItemsSource =「{Binding Path = MainWindowViewModel.TrackerCollection}」',我假設您的DataContext被設置爲包含名爲'MainWindowViewModel'的屬性,該屬性具有名爲'TrackerCollection'的集合屬性, TrackerViewModel's。確保這一切都是正確的。 – josh2112