DataTrigger на родительском свойстве - PullRequest
0 голосов
/ 12 декабря 2011

Как правильно установить свойство зависимостей IsAtLeastOneUserAvailable, если хотя бы одна из моих кнопок доступна?Свойство зависимости устанавливается в коде xaml.Таким образом, мы можем привязаться к нему следующим образом:

"{Binding IsAtLeastOneUserAvailable, ElementName = control}"

Я хочу скрыть метку, если в элементе управления не отображается элемент управления.ItemsControl.

<UserControl ... Name="control">
<Label Content="Test" Visibility={Binding IsAtLeastOneUserAvailable, ElementName=control">
<ItemsControl ItemsSource="{Binding Users, ElementName=control}" >
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Button Visibility="{Binding IsAvailable, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Button.Triggers>              
          <DataTrigger Binding="IsAvailable" Value="True">
            <Setter Property="IsAtLeastOneUserAvailable" Value="True" />
          </DataTrigger>
        </Button.Triggers>
        <StackPanel Orientation="Horizontal">
          <TextBlock Text="{Binding Name}"/>
        </StackPanel>
      </Button>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
</UserControl>

1 Ответ

0 голосов
/ 12 декабря 2011

Вместо того, чтобы пытаться установить значение с помощью триггера, почему бы просто не установить свойство UserControl.IsAtLeastOneUserAvailable в вашем UserControl на основе запроса linq?

public bool IsAtLeastOneUserAvailable
{
    get
    {
        return Users.Any(p => p.IsAvailable);
    }
}

Вы также можете вызвать это событие PropertyChanged в измененном событии пользователя:

public MyUserControl()
{
    Users.CollectionChanged += Users_CollectionChanged;
}

void Users_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
    if (e.NewItems != null)
        foreach(User user in e.NewItems)
            user.PropertyChanged += User_PropertyChanged;

    if (e.OldItems != null)
        foreach(User user in e.OldItems)
            user.PropertyChanged -= User_PropertyChanged;
}

void User_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsAvailable")
        RaisePropertyChanged("IsAtLeastOneUserAvailable");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...