如何在WPF ListView的禁用行中启用单元格

时间:2012-10-08 15:45:37

标签: wpf listview wpf-controls

我有一个WPF ListView,他的视图设置为GridView。列表中的行有时会被禁用,但我需要一列单元格才能启用。我们在“URL”列中显示一个链接,即使该行被禁用,用户也需要能够单击该链接。目前,如果禁用该行,则也会禁用该链接。

我目前在XAML中有这个:

        <ListView.View>
            <GridView>



                <GridViewColumn Header="Name">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock
                                Text="{Binding Item.Name}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Header="Description">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock
                                Text="{Binding Item.Description}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="URL">                       
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                         <Label>
                                <Hyperlink 
                                    Command="{Binding ViewModel.OpenInstructionsCommand}">
                                    <TextBlock Text="View"  />
                                </Hyperlink>
                            </Label>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>

1 个答案:

答案 0 :(得分:3)

虽然不能保证所有控件类型都没有副作用,但可以扩展要保持启用的控件,以忽略来自父控件的IsEnabled属性的传播。有关此示例,请参阅Cedric Dussud's post here

在这种情况下,您的代码可能如下所示:

internal class EnabledHyperlink : Hyperlink
{
    static EnabledHyperlink()
    {
        IsEnabledProperty.OverrideMetadata(typeof (EnabledHyperlink),
            new UIPropertyMetadata(true,
                IsEnabledPropertyChanged,
                CoerceIsEnabled));
    }

    private static void IsEnabledPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs args)
    {
    }

    private static object CoerceIsEnabled(DependencyObject source, object value)
    {
        return value;
    }
}