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

发布于 2024-11-30 13:13:36 字数 700 浏览 6 评论 0原文

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

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

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

请指导我......

谢谢

I have item container style for list view like below :

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

Now I need to add new setter for context menu programatically based on item data. How can I do it ?

Please guide me.....

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

や莫失莫忘 2024-12-07 13:13:36

我必须动态显示图像,并根据使用 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:这是我的第一篇文章

I have to display Images dynamically and show/hide depends on state of checkboxes using Style and 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>

After spec modification i have to create checkboxes dynamically, then to set Style.
At beginning, I have the same error message.

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.

The solution is to create a style object and Affect it to 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;

Hope that helping you

PS : It's my first post

心的位置 2024-12-07 13:13:36

我已经实现了以现有样式动态添加设置器的逻辑,如下所示:

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

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

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

I have implemented logic to add setter dynamically in existing style like below :

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

But it gives me following error :
"After a 'SetterBaseCollection' is in use (sealed), it cannot be modified."

I think it is not possible to add new setter in sealed style. So I have got another temporary solution like assign context menu to whole listview rather than it's item on preview mouse right click event. So context menu will be same for all items then managed in coding based on data of selected item.

虐人心 2024-12-07 13:13:36
<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>
<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>
总攻大人 2024-12-07 13:13:36

如果您创建一个新的 Style() 并“重新添加”设置器,并且使用 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);
        }
    }

If you create a new Style() and "re-add" the the setters, you can get around this issue if you are using 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);
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文