Как добавить новый сеттер программно в существующий ItemContainerStyle в WPF? - PullRequest
2 голосов
/ 19 августа 2011

У меня есть стиль контейнера элемента для списка, как показано ниже:

<ListView.ItemContainerStyle>
    <Style>
        <Setter Property="Padding" Value="0"></Setter>
        <Setter Property="Margin" Value="0,0,0,-1"></Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=EventType}" Value="2">
                <Setter Property="Background" Value="Green"/>
                <Setter Property="Foreground" Value="White"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>

Теперь мне нужно добавить новый установщик для контекстного меню программно на основе данных элемента.Как я могу это сделать?

Пожалуйста, ведите меня .....

Спасибо

Ответы [ 4 ]

8 голосов
/ 29 мая 2012

Мне нужно отображать изображения динамически, а отображение / скрытие зависит от состояния флажков с использованием Style и DataTrigger.

<Image Source="/WpfApplication;component/Imgs/img1_1.png">
<Image.Style>
    <Style>
        <Setter Property="Image.Visibility" Value="Collapsed"></Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=isDisplayingImgSet1, Path=IsChecked}" Value="True">
                <Setter Property="Image.Visibility" Value="Visible"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>

После изменения спецификации я должен динамически создавать флажки, затемустановить стиль.Вначале у меня такое же сообщение об ошибке.

Image img = new Image();
//..
img.Style.Setters.Add(setter);
img.Style.Triggers.Add(trigger);
//..After a 'SetterBaseCollection' is in use (sealed), it cannot be modified.

Решение состоит в том, чтобы создать объект стиля и применить его к Image.Style

//Visibility
DataTrigger trigger = new DataTrigger();
trigger.Binding = new Binding
{
     ElementName = "isDisplayingImgSet"+NumSet,
     Path = new PropertyPath(CheckBox.IsCheckedProperty)
};
trigger.Value = "True";
trigger.Setters.Add(new Setter(ContentControl.VisibilityProperty, Visibility.Visible));

Setter setter = new Setter(ContentControl.VisibilityProperty, Visibility.Collapsed);
Style style = new Style(typeof(Image));
style.Setters.Add(setter);
style.Triggers.Add(trigger);
img.Style = style;

Надеюсь, что вам поможет

PS: это мой первый пост

1 голос
/ 23 августа 2011

Я реализовал логику для динамического добавления сеттера в существующий стиль, как показано ниже:

listview1.ItemContainerStyle.Setters.Add(new Setter(Control.ContextMenuProperty,GetItemContextMenu(txtName.Text)));

Но это дает мне следующую ошибку: «После использования SetterBaseCollection (запечатанный) его нельзя изменить.»

Я думаю, что невозможно добавить новый сеттер в запечатанном стиле. Так что у меня есть другое временное решение, например, назначить контекстное меню всему списку, а не его элементу при щелчке правой кнопкой мыши. Таким образом, контекстное меню будет одинаковым для всех элементов, которые затем будут обрабатываться в кодировке на основе данных выбранного элемента.

0 голосов
/ 25 июля 2016

Если вы создадите новый стиль () и «заново добавите» сеттеры, вы можете обойти эту проблему, если используете Telerik.

    private static void AddColumnSetter(GridViewColumn gridColumn, SetterBase setter)
    {
        var setters = new SetterBaseCollection();

        if (gridColumn.CellStyle != null)
        {
            foreach (SetterBase setterBase in gridColumn.CellStyle.Setters)
            {
                setters.Add(setterBase);
            }
        }

        setters.Add(setter);
        gridColumn.CellStyle = new Style();

        foreach (var setr in setters)
        {
            gridColumn.CellStyle.Setters.Add(setr);
        }
    }
0 голосов
/ 19 августа 2011
<ListView.ItemContainerStyle>
<Style>
        <Setter Property="Padding" Value="0"></Setter>
        <Setter Property="Margin" Value="0,0,0,-1"></Setter>
        <Setter Property="ContextMenu">
            <Setter.Value>
                  <ContextMenu/>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=EventType}" Value="2">
                <Setter Property="Background" Value="Green"/>
                <Setter Property="Foreground" Value="White"></Setter>
                <Setter Property="ContextMenu">
                  <Setter.Value>
                    <ContextMenu/>
                  </Setter.Value>
                </Setter>
            </DataTrigger>
</Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...