2011-02-14 70 views
1

我有一個列表框,其中包含一個按字母順序排列的單詞列表。對於每封信,我希望第一個單詞是藍色,其他所有單詞都是白色的。我之前通過循環遍歷單詞,使用適當的Foreground顏色創建TextBlock控件,並將它們手動添加到ListBox控件來完成此操作。不過,我想用數據綁定來做這件事。有沒有一種優雅的方式來應用這種條件格式與數據綁定?Silverlight數據綁定 - 如何根據以前的元素動態更改元素的樣式?

回答

1

這就是你通常使用ViewModel的一類東西。你可以做的是建立一個WordViewModel類,看起來是這樣的(但推測可能與INotifyPropertyChanged的實現等):

public class WordViewModel 
{ 
    public string Word {get; set;} 
    public Color ForegroundColor {get; set;} 
} 

當您添加WordViewModel情況下,你ObservableCollection<WordViewModel>,那麼您需要設置相應的屬性基於你以前使用的大致相同的邏輯。然後

你的列表框會是這個樣子:

<ListBox ItemsSource="{Binding MyWords}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Word}" ForegroundColor="{Binding ForegroundColor}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

有一個「ForegroundColor」的模式當然會是一個完整違反了「關注點分離」的。如果有一個乾淨而簡單的方法可以做到這一點,那麼在View中最合適。但是考慮到這種情況,除非有人能想到在XAML中處理它的更好方法,我認爲將它放在ViewModel中是合理的。