2011-06-27 46 views
3

我一個ObservableCollection綁定到具有轉換取決於如果集合有任何值,或不改變其可見性控制:WPF轉換器和ObservableCollections

簡單的例子:

XAML:

<Window.Resources> 
    <local:MyConverter x:Key="converter"/> 
</Window.Resources> 

<Grid x:Name="grid"> 
    <Rectangle Height="100" Width="200" Fill="CornflowerBlue" 
       Visibility="{Binding Converter={StaticResource converter}}"/> 
    <Button Content="click" 
      HorizontalAlignment="Left" VerticalAlignment="Top" 
      Click="Button_Click"/> 
</Grid> 

C#:

ObservableCollection<string> strings; 

public MainWindow() 
{ 
    InitializeComponent(); 

    strings = new ObservableCollection<string>(); 
    grid.DataContext = strings; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    strings.Add("new value"); 
} 

當收集綁定,當有值,而不是當集合爲空矩形是可見的。但是,如果集合爲空,並且我在運行時添加了一個值,則不會顯示Rectangle(轉換器的Convert方法甚至沒有被觸發)。我是否錯過了某些東西,或者只是想要問太多的IValueConverter?

+0

所以......結合的ObservableCollection .Count中,使轉換器的工作如預期那麼我猜測,向集合中添加一個值不會引發PropertyChanged事件......我認爲這是一個臨時解決方案,它將對集合進行多重綁定,它是.Count方法,但這聽起來很討厭...... –

回答

2

好了,這裏是我如何使用MultiValueConverter

得到了解決此問題的轉換器現在看起來像:

public object Convert(
    object[] values, 
    Type targetType, 
    object parameter, 
    System.Globalization.CultureInfo culture) 
{ 
    ObservableCollection<string> strings = 
     values[0] as ObservableCollection<string>; 

    if (strings == null || !strings.Any()) 
     return Visibility.Collapsed; 
    else 
     return Visibility.Visible; 
} 

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

而XAML現在看起來像:

<Rectangle Height="100" Width="200" Fill="CornflowerBlue"> 
    <Rectangle.Visibility> 
     <MultiBinding Converter="{StaticResource converter}"> 
      <Binding Path="."/> 
      <Binding Path="Count"/> 
     </MultiBinding> 
    </Rectangle.Visibility> 
</Rectangle> 

的C#仍然是相同的:)

+3

這個工作的原因是「Count」屬性發生了變化,它觸發了Converter。「Multi」轉換器在這種情況下是無用的,您可以使用同樣的方法使用 '' 其中CountTovisibilityConverter實現的IValueConverter,你只需要比較值(int類型)爲0,返回的知名度。 再次,最好的問候 – daniell

+0

什麼丹尼爾說跟進,這如果您使用ObservableCollection.SetItem,它不會更新計數 – hypehuman

+0

什麼可見性轉換器@daniell !? –

0

創建集合後必須設置DataContext;很可能你將「strings」集合初始化爲「null」,你在構造函數中將DataContext設置爲該值(例如null),然後實際創建集合 - 這樣,DataContext保持爲空。

您必須創建收集後再次設置的DataContext。

+0

設置DataContext之後創建集合只意味着它只能運行一次,如果在運行時添加值,它仍然不會改變。我有一個使用MultiValueConverters的解決方案,我會在一分鐘後發佈:) –

1

我認爲在綁定的轉換器如果綁定源已更新並通知該更新(作爲DependencyProperty或使用INotifyPropertyChanged),則始終調用該方法。但是,如果已添加或刪除項目,則ObservableCollection不會引發PropertyChanged事件,但會引發CollectionChanged事件。如果集合中的項目發生更改,它根本不會引發任何事件。即使項目本身引發PropertyChanged,但由於Binding源不是項目,而是集合,因此它不會更新集合上的Binding。

我擔心你的做法會不會以這種方式工作。你可以直接綁定到ObservableCollection.Count並添加一個適當的數學轉換器來執行反轉和乘法,但是Count屬性不會執行更改通知,所以這個沒有選擇。我想你將不得不提供您的視圖模型或處理這些情況的代碼隱藏他人財產......

最好的問候,

+3

是的,我已經閱讀您似乎已抄襲這篇文章從(http:// stackov erflow.com/questions/2816163/when-will-the-valueconverters-convert-method-be-called-in-wpf)。 MultiValueConverter在任何情況下都可以做到這一點 –

+0

「剽竊」? 很高興你找到你的解決方案.. 最好的問候 – daniell