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

如何在WPF中现有的ItemContainerStyle中以编程方式添加新的setter?,wpf,xaml,styles,Wpf,Xaml,Styles,我有列表视图的项目容器样式,如下所示: <ListView.ItemContainerStyle> <Style> <Setter Property="Padding" Value="0"></Setter> <Setter Property="Margin" Value="0,0,0,-1"></Setter> <Style.Triggers>

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

<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>
listview1.ItemContainerStyle.Setters.Add(new Setter(Control.ContextMenuProperty,GetItemContextMenu(txtName.Text)));

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

请引导我

谢谢


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

<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>
listview1.ItemContainerStyle.Setters.Add(new Setter(Control.ContextMenuProperty,GetItemContextMenu(txtName.Text)));
但它给了我以下错误: “SetterBaseCollection”正在使用(密封)后,无法对其进行修改。”


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

我必须动态显示图像,显示/隐藏取决于使用样式和数据触发器的复选框的状态

<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.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:这是我的第一篇文章

如果你创建了一个新的样式()并“重新添加”了setter,如果你使用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);
        }
    }

我需要添加上下文菜单和它的事件处理程序动态基于绑定数据的项目,而不是静态请。你能提供更多的细节吗?你使用MVVM吗?列表框绑定到哪个集合?我需要在鼠标右键单击时动态创建上下文菜单,或者项目选择更改事件导致我需要根据列表视图中选择的项目添加菜单项,例如:如果我的col1=1,则将有2个菜单项,如果col1=2,则将有3个菜单项,依此类推。此外,该条件不仅适用于一列,而且基于2或3列的数据。因此,我不能为您在代码中创建的每个数据触发器创建静态上下文菜单。所以我需要在右键单击或选择更改事件时使其动态。我希望这能让您对我的要求有更多的了解。…
'System.Windows.Controls.GridViewColumn'
没有包含
'CellStyle'
的定义。我应该提到类型是Telerik.Windows.Controls.GridViewColumn。