2012-06-02 47 views
0

可以使用帶List的IValueConverter。它可以在第一次使用菜單時使用。當我更新列表中的項目時,它不會再次調用IValueConverter? 例子:WPF:帶列表的IValueConverter

    <MenuItem Header="{Binding Path=DataContext.Documents, RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type ListView}}, Converter={StaticResource DocumentsToString}, Mode=OneWay}"> 
        <MenuItem.Icon> 
         <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/> 
        </MenuItem.Icon> 
       </MenuItem> 

而且ValueConverters.cs

public class ListDocumentToStringConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var selectedDocuments = (ObservableCollection<Document>) value; 
     var result = ""; 
     foreach (var document in selectedDocuments) 
     { 
      result += document.Name + "\t"; 
     } 
     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

轉換器僅在'Documents'屬性獲得新值時才被調用;如果'Documents'屬性引用的集合保持不變,即使將「Document」項添加到該集合,轉換器也不會被調用。你真的想把所有的文檔名稱寫入一個'MenuItem'嗎?或者你想爲每個文檔創建一個'MenuItem'?如果後者是這種情況,請將您的集合分配給'Menu.ItemsSource'。 – 2012-06-02 05:40:18

+0

我使用Document.SelectedCount,如果我點擊Document中的另一個項目,它再次調用轉換器 –

回答

0

爲了增加fmunkert的評論是正確的,如果你打算舉辦一個菜單項中的所有這些項目,你可以喜歡寫東西這個:

<MenuItem> 
    <MenuItem.Header> 
     <ItemsControl ItemsSource="{Binding Path=DataContext.Documents, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </MenuItem.Header> 
    <MenuItem.Icon> 
     <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/> 
    </MenuItem.Icon> 
</MenuItem> 

這樣你就不必使用轉換器了。如果你想改變這些項目相對於彼此的佈局方式,比如在你的示例中使用兩個選項卡,那麼你會想要模擬ItemsControl的ItemsPanel。默認情況下它是一個垂直的StackPanel。你可以將其更改爲水平的StackPanel像這樣:

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

然後你就可以添加間距或保證金給每個TextBlock的項目,實現視覺但是你想。