Silverlight HyperlinkButton в столбце DataGrid. Должны дважды щелкнуть - PullRequest
0 голосов
/ 21 июля 2011

У меня есть столбец сетки данных с кнопками гиперссылки.Вы должны нажать кнопку дважды, чтобы кнопка сделала то, что должна.Я думаю, что первый щелчок на самом деле выбирает строку.

Я полагаю, что что-то происходит, когда событие не всплывает (или не падает?) К кнопке гиперссылки.

Идеи?

edit

Вот xaml:

    <sdk:DataGrid Grid.Row="1" x:Name="workflowsGrid" Margin="6,20,6,0" ItemsSource="{Binding FilteredSource,ElementName=workflowsFilter}"
          AutoGenerateColumns="False" SelectedItem="{Binding SelectedWorkflow,Mode=TwoWay}"
              SelectionChanged="workflowsGrid_SelectionChanged">
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn Header="Name" Binding="{Binding Description}"/>          
        <sdk:DataGridTemplateColumn Header="Action" >
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding Converter={StaticResource actionConverter}}"/>
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

А вот конвертер, который добавляет кнопки гиперссылки:

/// <summary>
/// Dynamically controls the action cell in the workflows grid
/// </summary>
protected class ActionValueConverter : IValueConverter
{
    private WorkflowManager _page;
    public ActionValueConverter(WorkflowManager page)
    {
        _page = page;
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var workflow = (WorkflowInstance)value;
        if (workflow.Status == "Complete")
        {
            // create hyperlink buttons for each action that the workflow supports
            var btns = workflow.Definition.Actions
                .Select(x =>
                {
                    HyperlinkButton btn = new HyperlinkButton
                    {
                        Tag = Tuple.Create(workflow, x.Key),
                        Content = x.Value,
                    };
                    btn.Click += new RoutedEventHandler(_page.ActionButton_Click);
                    return btn;
                });

            // stack panel to contain all the buttons
            StackPanel sp = new StackPanel { Orientation = Orientation.Vertical };
            foreach (var btn in btns)
                sp.Children.Add(btn);

            return sp;
        }
        else if (workflow.Status == "In Progress")
        {
            // create only a cancel hyperlink button
            HyperlinkButton btnCancel = new HyperlinkButton { Content = "Cancel", Tag = Tuple.Create(workflow, "Cancel") };
            btnCancel.Click += new RoutedEventHandler(_page.ActionButton_Click);
            return btnCancel;
        }
        else
        {
            throw new Exception("workflow status not supported: " + workflow.Status);
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

1 Ответ

2 голосов
/ 21 июля 2011

Возможно, вам следует использовать шаблон «Редактировать» вместо шаблона «Ячейка», как указано в следующей ссылке:

http://forums.silverlight.net/p/132619/296134.aspx

Таким образом, ваш столбец ссылок всегда будет находиться в режиме редактирования и требует только одного нажатия.

Edit:

<sdk:DataGridTemplateColumn.CellEditingTemplate >

вместо

<sdk:DataGridTemplateColumn.CellTemplate>

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...