【问题标题】:How to have a list of clickable HyperLinks in a GridViewColumn of a ListView?如何在 ListView 的 GridViewColumn 中拥有可点击的超链接列表?
【发布时间】:2011-03-26 02:07:03
【问题描述】:

我正在尝试将对象列表绑定到HyperLinks 列表,这些对象以逗号分隔且可点击。

如果每个单元格只有一个,我可以这样做,但我不知道如何为每个单元格绑定一个集合。

单个GridViewColumn 单元格中的类似内容:

Effect01, Effect02, Effect02, Shader01. Shader02

点击其中任何一个都会调用绑定对象的Execute 方法。

每个元素是:

public class EffectLink : IExecutable
{
    public string Name {get; set;}
    public void Execute ();
}

IExecutable 强制执行。

我这样做是因为Execute 的行为将取决于它是着色器、效果等。

有什么想法吗?

编辑:

我发现我可以这样做:

<TextBlock>
    <Hyperlink>Effect01</Hyperlink>
    <Hyperlink>Effect02</Hyperlink>
</TextBlock>

因此,这在单个单元格中显示了 2 个以空格分隔的超链接。

这个问题也可能是相关的,但它显示了如何在代码中而不是 xaml: Nested TextBlocks and Hyperlinks, How do you replicate this XAML in C#?

【问题讨论】:

    标签: c# .net wpf xaml hyperlink


    【解决方案1】:

    在您的GridViewColumn.CellTemplate 中添加ItemsControl

        <GridViewColumn >
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ItemsControl ItemsSource="{Binding}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
    
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock x:Name="commaTextBlock" Text=", " />
                                    <TextBlock><Hyperlink><Run Text="{Binding Path=Name}" /></Hyperlink></TextBlock>
                                </StackPanel>
    
                                <DataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
                                        <Setter Property="Visibility" TargetName="commaTextBlock" Value="Collapsed"/>
                                    </DataTrigger>
                                </DataTemplate.Triggers>
                            </DataTemplate>
    
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    

    【讨论】:

    • 谢谢,不同之处在于 Effects 集合位于 ObservableCollection 内部,因此 Effects 是每个 GraphNode 的属性。你知道我如何将它绑定到这个集合吗?目前 ListView ItemsSource 设置为 ObservableCollection,因此这些超链接应该从每个 GraphNode.Effects 集合生成。有意义吗?
    • 而不是 &lt;ItemsControl ItemsSource="{Binding}"&gt; 你会有 &lt;ItemsControl ItemsSource="{Binding Path=Effects}"&gt;
    • 更新了逗号的 xaml 和您提到的额外超链接填充
    • 您可以将HyperLink.Command 绑定到您的EffectLink 对象上的ICommand,该对象可以调用您的Execute() 方法
    • 好吧,您可能需要在 EffectLink 上创建一个名为 ExecuteCommand 的 ICommand 类型的属性,并使用类似 RelayCommand 的东西将 ExecuteCommand 挂钩到您的 Execute 方法,然后您的 HyperLink 绑定看起来像 Command ="{绑定路径=ExecuteCommand}"
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多