WPF Multi-Binding / Совокупное связывание с коллекцией - PullRequest
0 голосов
/ 30 мая 2018

У меня есть элемент управления, который я хочу автоматически исчезнуть, если другой элемент управления не имеет visibile потомков.Я не уверен, как это реализовать, хотя.Мне кажется, что мне нужно создать привязку, которая возвращает привязки для видимого свойства каждого дочернего элемента, а затем объединяет их в MultiValueConverter.Я думаю, что это работает, но кажется, что когда я добавляю элементы в свою коллекцию, привязка коллекции не переоценивается.Кто-нибудь делал это раньше?

Ниже мой код:

    <Grid.Resources>
        <local:BindingExpander x:Key="BindingExpander"/>
        <local:TestConverter x:Key="TestConverter" />
    </Grid.Resources>

    <Button Content="Button" HorizontalAlignment="Left" Margin="237,166,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click">
        <Button.Visibility>
            <MultiBinding Converter="{StaticResource TestConverter}">
                <Binding ElementName="lstItems" Path="Items" Converter="{StaticResource BindingExpander}" ConverterParameter="Visibility"/>
            </MultiBinding>
        </Button.Visibility>
    </Button>

    <ListBox x:Name="lstItems" HorizontalAlignment="Left" Height="100" Margin="601,130,0,0" VerticalAlignment="Top" Width="100" DisplayMemberPath="Content"/>

и:

public class TestConverter : IMultiValueConverter {
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
        var ret = Visibility.Collapsed;

        foreach (var item in values) {
            if(item is IEnumerable IE) {
                foreach (var Child in IE) {

                }
            }
        }

        return ret;
    }

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

public class BindingExpander : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        var ret = new List<Binding>();
        if(value is IEnumerable IE) {
            foreach (var item in IE) {
                ret.Add(new Binding(parameter.ToString()) {
                    Source = item,
                    Mode = BindingMode.OneWay
                });
            }
        }

        return ret;
    }

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

`` ``

1 Ответ

0 голосов
/ 30 мая 2018

У меня есть элемент управления, который я хочу автоматически исчезать, если другой элемент управления не имеет видимых дочерних элементов.

Просто создайте логическое свойство, которое сообщает состояние привязки другого элемента управления.например:

public bool HasItems { get { return _SomeArray?.Any(); }}

Это свойство может быть настолько сложным, насколько это необходимо, но показано базовое свойство, приведенное выше для примера.

Затем свяжите флаг видимостирассматриваемого элемента управления HasItems.

Обратите внимание, что HasItems не имеет слесарного дела для INotifyPropertyChanged.В коде (ах), где элементы добавляются к _SomeArray, просто введите вызов PropertyChanged("HasItems")


В моем блоге я привожу базовый пример этого ( Xaml: ViewModelСтратегия создания и загрузки главной страницы для упрощения привязки ), которая выглядит так, когда кто-то связывает с IsMemebershipAtMax, например, с тем, что вы делаете:

   public bool IsMembershipAtMax 
    {
        get { return MemberCount > 3; }
    }
    public int MemberCount 
    { 
        get { return _MemberCount; }
        set
        {
            _MemberCount = value; 
            OnPropertyChanged();
            OnPropertyChanged("IsMembershipAtMax");
        } 
    }

    public List<string> Members 
    { 
        get { return _Members; }
        set { _Members = value; OnPropertyChanged(); } 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...