如何通过上下文菜单控制动态生成控件的可见性?

3
我是一名有用的助手,可以为您翻译文本。

我有一个ItemsControl,它绑定到ViewModel中的属性列表,并使用DataTemplate根据属性的类型自动生成适当的控件。

这是ItemsControl的代码:

<ItemsControl Grid.Column="0" ItemsSource="{Binding Properties}" >
    <ItemsControl.Resources>
        <DataTemplate x:Key="StringTemplate" DataType="{x:Type ui:ControlStringData}" >
            <xctk:WatermarkTextBox Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                        Watermark="{Binding Path=Caption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                        Margin="5,5,5,5" />
        </DataTemplate>
        <DataTemplate x:Key="DateTimeTemplate" DataType="{x:Type ui:ControlDateTimeData}">
            <xctk:DateTimePicker Value="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                        Watermark="{Binding Path=Caption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                        Margin="5,5,5,5" />
        </DataTemplate>
        <DataTemplate x:Key="DefaultTemplate" />
    </ItemsControl.Resources>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentControl
                    x:Name="MyContentControl"
                    Content="{Binding}"
                    ContentTemplate="{StaticResource DefaultTemplate}"/>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=Type}" Value="DateTime">
                    <Setter TargetName="MyContentControl" Property="ContentTemplate"
                                Value="{StaticResource DateTimeTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Type}" Value="String">
                    <Setter TargetName="MyContentControl" Property="ContentTemplate"
                                Value="{StaticResource StringTemplate}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

现在,给定生成的控件,我想创建一个带有标题属性和复选框的ContextMenu,其中每个ContextMenu中的项目都绑定到相应控件的可见性。
我目前的代码是一个按钮,将打开一个上下文菜单,如下所示:
<Button Margin="5,5,5,5" Grid.Column="1" Grid.Row="0" Height="16" Width="16">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu />

                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>

如何创建上下文菜单并将选项绑定到可见性?我被卡住了,因为我不确定如何正确设置绑定来实现这一点。
更多详情:
所以在上述ItemsControl中,它绑定到一个名为“属性”的属性列表,其中每个元素都实现:
public interface IControlData
{
    string Type { get; set; }
    string Name { get; set; }
    string Caption { get; set; }
    bool Visibility { get; set; }
}

根据Type字符串,我在上述内容中使用数据触发器来生成相应类型的正确控件,并将它们放置在被模板化为UniformGrid的ItemsControl中。
现在,我想要一个按钮,当点击时会呈现出ItemsControl中每个控件的名称列表,每个条目都可以勾选,勾选状态对应于ItemsControl中控件的可见性。
例如:如果ItemsControl网格如下所示:
+----------+----------+
| TextBox1 | TextBox2 |
+----------+----------+
| TextBox3 | TextBox4 |
+----------+----------+

当我点击按钮时,显示的上下文菜单将是:
+---+----------+
| ✓ | TextBox1 |
| ✓ | TextBox2 |
| ✓ | TextBox3 |
| ✓ | TextBox4 |
+---+----------+

如果我点击ContextMenu中的一个条目,比如说TextBox4,它会将TextBox4的可见性设置为false,而项目控件会显示为:
+----------+----------+
| TextBox1 | TextBox2 |
+----------+----------+
| TextBox3 |          |
+----------+----------+

而上下文菜单将显示为:

+---+----------+
|  | TextBox1 |
|  | TextBox2 |
|  | TextBox3 |
|   | TextBox4 |
+---+----------+

ChangePropertyAction切换父对象或其他对象上的Loaded EventTrigger的可见性可能是一种方法。 - Chris W.
我在 MSDN 上查找了这些内容,但对如何实现它们感到有些困惑。你能否给我一个快速的撰写/示例呢?按钮和项控件都在同一个网格下。 - Gyrien
当然,如果我有时间,那没问题。只是为了确保我理解正确(因为我有点模糊),当你说你想创建上下文菜单并将选项绑定到可见性时,你能详细说明一下吗?也许有什么可以帮助你更好地展现整体需求的东西? - Chris W.
我在原帖中添加了更多细节,请让我知道是否还有需要澄清的地方。 - Gyrien
1
好的,我现在理解更多了。我的建议在这种情况下行不通,我离开前还会再考虑一下。但是,它需要更多的东西,而不仅仅是像我最初想的那样的XAML。 - Chris W.
太棒了!不过,你确定不能完全使用XAML吗?虽然这不是我的要求,但是尽量少用代码会更好! - Gyrien
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接