如何在WPF中的现有ItemContainerStyle中以编程方式添加新的setter?

时间:2011-08-19 11:16:49

标签: wpf xaml styles

我有列表视图的项容器样式,如下所示:

<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>

现在我需要根据项目数据以编程方式为上下文菜单添加新的setter。我该怎么办?

请指导我.....

由于

4 个答案:

答案 0 :(得分:7)

我必须动态显示图像,显示/隐藏取决于使用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 :(得分:1)

我已经实现了逻辑,以现有的方式动态添加setter,如下所示:

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

但它给了我以下错误: “在'SetterBaseCollection'正在使用(密封)之后,它无法修改。”

我认为不可能以密封方式添加新的setter。所以我有另一个临时解决方案,比如将上下文菜单分配给整个列表视图而不是预览鼠标右键单击事件上的项目。因此,所有项目的上下文菜单都是相同的,然后根据所选项目的数据进行编码管理。

答案 2 :(得分:0)

<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>

答案 3 :(得分:0)

如果你创建一个新的Style()和&#34;重新添加&#34;如果你使用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);
        }
    }