2015-04-07 45 views
0

我有一個ItemsControl和ItemsControl外的Button。 ItemsControl中的每個項目都有一個名爲「MyProperty」的依賴屬性(在代碼隱藏中定義)。從ItemsControl中的每個項目的屬性綁定到ItemsControl外部的對象的屬性

當ItemsControl中至少有一個項目的MyProperty屬性設置爲5時,我想將Button的IsEnabled屬性設置爲false(當然,這僅僅是一個更復雜情況的愚蠢示例)

我試圖通過數據觸發的方式,但沒有運氣:

XAML:

<Window x:Class="cancellami24.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <Style x:Key="MyStyle" TargetType="{x:Type ContentPresenter}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=MyProperty}" Value="5"> 
        <Setter Property="IsEnabled" TargetName="MyButton" Value="False" /><!--error on TargetName--> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <ItemsControl x:Name="MyListBox" Grid.Row="0" ItemContainerStyle="{StaticResource MyStyle}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

     <Button x:Name="MyButton" Grid.Row="1" Click="MyButton_Click"/> 
    </Grid> 
</Window> 

代碼隱藏:

using System.Collections.ObjectModel; 
using System.Windows; 

namespace cancellami24 
{ 
    public partial class MainWindow : Window 
    { 
     private readonly ObservableCollection<MyItem> myCollection = new ObservableCollection<MyItem>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      myCollection.Add(new MyItem(1)); 
      myCollection.Add(new MyItem(2)); 
      myCollection.Add(new MyItem(3)); 
      MyListBox.ItemsSource = myCollection; 
     } 

     private void MyButton_Click(object sender, RoutedEventArgs e) 
     { 
      myCollection[2].SetValue(MyItem.MyPropertyProperty, 5); 
     } 
    } 

    public class MyItem : DependencyObject 
    { 
     public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(int), typeof(MyItem)); 

     public MyItem(int propertyValue) 
     { 
      SetValue(MyPropertyProperty, propertyValue); 
     } 
    } 
} 

回答

0

您需要自定義轉換來解決它

public class MyConverter : IValueConverter 
{ 
    bool flag = false; 
    var collection = value as ObservableCollection<MyItem>(); 
    if(collection==null) return flag; 
    foreach (var item in collection) 
    { 
     if (item.MyProperty==5) 
     { 
      flag = true; 
      break; 
     } 
    } 
    return flag; 
} 

添加MyConverter到你的App.xaml

<local:MyConverter x:key="MyConverter"/> 

的XAML:

<Button x:Name="MyButton" IsEnabled="{Binding ElementName=MyListBox, Path=ItemsSource, Converter={StaticResource MyConverter}}"/> 
+0

我想要的按鈕變化IsEnabled屬性每當我在其中一個項目中更改MyProperty屬性時。我測試了你的解決方案(通過修改它),不幸的是,IsEnabled屬性在應用程序啓動時只更新一次。 – cassiodoroVicinetti

相關問題