2011-09-21 22 views
10

在WPF中,你可以使用的IValueConverter或IMultiValueConverter轉換從數據綁定值說的intColor.有什麼方法可以轉換用作ItemsSource的集合的成員?

我Model對象的集合,我想轉換到自己的視圖模型的表示,但在這種情況下,

<ListBox ItemsSource="{Binding ModelItems, 
    Converter={StaticResource ModelToViewModelConverter}" /> 

該轉換器將被寫入以一次轉換整個集合ModelItems

我希望單獨轉換集合的項目,有沒有辦法做到這一點?

回答

21

您無法在集合本身上設置轉換器,因爲它會將集合作爲輸入。你有兩個選擇:

  1. 確保你的轉換器也可以處理集合(IEnumerable)。
  2. 在項目模板中使用轉換器。

如果要使用第二種方法,然後用這樣的:

<ListBox ItemsSource="{Binding ModelItems}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <ContentPresenter Content="{Binding Converter={StaticResource ModelToViewModelConverter}}" 
         ContentTemplate="{StaticResource MyOptionalDataTemplate}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

如果您不需要自定義的DataTemplate,那麼你可以跳過的ContentTemplate屬性。

+0

謝謝,我認爲應該爲我工作,我會試試看。 – Grokodile

2

是的,你可以。它的行爲與IValueConverter相同。您只需將Convert方法的值參數作爲集合處理即可。

這裏是一個集轉換器的一個例子:

public class DataConvert : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ObservableCollection<int> convertible = null; 
     var result = value as ObservableCollection<string>; 

     if (result != null) 
     { 
      convertible = new ObservableCollection<int>(); 
      foreach (var item in result) 
      { 
       if (item == "first") 
       { 
        convertible.Add(1); 
       } 
       else if (item == "second") 
       { 
        convertible.Add(2); 
       } 
       else if (item == "third") 
       { 
        convertible.Add(3); 
       } 
      } 
     } 

     return convertible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

在這種情況下,僅僅是概念證明,但我認爲它應該顯示這個想法非常好。 轉換器從一個簡單的字符串集合這樣的轉換:

ModelItems = new ObservableCollection<string>(); 
     ModelItems.Add("third"); 
     ModelItems.Add("first"); 
     ModelItems.Add("second"); 

成對應的字符串含義整數的集合。

這裏是相應的XAML(LOC是當前裝配哪裏是轉換器的參考):

<Window.Resources> 
    <loc:DataConvert x:Key="DataConverter"/> 
</Window.Resources> 
<Grid x:Name="MainGrid"> 
    <ListBox ItemsSource="{Binding ModelItems, Converter={StaticResource DataConverter}}"/> 
</Grid> 

如果你想使一個雙向綁定,你必須也實現轉換回。從使用MVVM的經驗中,我建議使用像Factory Pattern這樣的東西來從ViewModel中的模型轉換並向後轉換。

+1

感謝louie,但這並不是我真正想要的,我可能想要使用CollectionViewSource並擁有一些過濾邏輯,所以我不希望每次更改時都必須遍歷整個集合,因此最後一個我的問題的句子。 – Grokodile

+0

對不起,我沒有看到最後一句話。祝你好運。 – louie

0

這是另一個例子。我正在使用MVVM Caliburn Micro。 MyObjects是我的例子中的枚舉列表。

<ListBox x:Name="MyObjects"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding ., Converter={StaticResource MyConverter}}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
相關問題