Установщик триггера XAML и свойство типа UIElementCollection - PullRequest
2 голосов
/ 30 января 2011

Мой элемент управления имеет свойство Buttons типа UIElementCollection.Можно ли изменить такое свойство с помощью триггеров (в частности DataTrigger)?

У меня следующий код:

<Setter Property="Buttons">
    <Setter.Value>
        <Button>A</Button>
        <Button>B</Button>
    </Setter.Value>
</Setter>

И я получаю сообщение об ошибке «Значение свойства установлено более одного раза».Обертывание кнопок в теге UIElementCollection не работает (UIElementCollection не имеет конструктора по умолчанию).Если я удаляю вторую кнопку, я получаю исключение, что свойство Buttons несовместимо с типом Button.

Спасибо за любую помощь

Ответы [ 3 ]

3 голосов
/ 30 января 2011

Вы можете использовать прикрепленное поведение, чтобы изменить коллекцию с помощью установщика. Вот рабочий пример, основанный на свойстве Panel.Children, которое также является UIElementCollection:

<Grid>
    <Grid.Resources>
        <Style x:Key="twoButtons" TargetType="Panel">
            <Setter Property="local:SetCollection.Children">
                <Setter.Value>
                    <x:Array Type="UIElement">
                        <Button Content="Button1"/>
                        <Button Content="Button2"/>
                    </x:Array>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    <StackPanel Style="{StaticResource twoButtons}"/>
</Grid>

А вот и прикрепленное свойство SetCollection.Children:

public static class SetCollection
{
    public static ICollection<UIElement> GetChildren(DependencyObject obj)
    {
        return (ICollection<UIElement>)obj.GetValue(ChildrenProperty);
    }

    public static void SetChildren(DependencyObject obj, ICollection<UIElement> value)
    {
        obj.SetValue(ChildrenProperty, value);
    }

    public static readonly DependencyProperty ChildrenProperty =
        DependencyProperty.RegisterAttached("Children", typeof(ICollection<UIElement>), typeof(SetCollection), new UIPropertyMetadata(OnChildrenPropertyChanged));

    static void OnChildrenPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var panel = sender as Panel;
        var children = e.NewValue as ICollection<UIElement>;
        panel.Children.Clear();
        foreach (var child in children) panel.Children.Add(child);
    }
}
2 голосов
/ 30 января 2011

Редактировать: В качестве обходного пути можно использовать конвертер, определите свои кнопки в списке в некоторых ресурсах:

    <col:ArrayList x:Key="Buttons">
        <Button>A</Button>
        <Button>B</Button>
    </col:ArrayList>

Пространство имен: xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"

Ииспользуйте пользовательский конвертер в установщике, чтобы превратить его в коллекцию:

<Setter Property="Buttons" Value="{Binding Source={StaticResource Buttons}, Converter={StaticResource ListToUIElementCollectionConverter}}"/>

Редактировать: Настройка этого для работы не является тривиальной задачей, поскольку конвертер должен знать родительский объектдля конструктора UIElementCollection.

0 голосов
/ 10 февраля 2011

В итоге я решил обойти проблему, изменив (с помощью триггеров) отдельные элементы коллекции (отдельные кнопки) вместо изменения всей коллекции.

Я просто скрываю и показываю кнопки в зависимости от некоторыхусловия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...