簡體   English   中英

WPF MVVM:在單擊按鈕時將焦點設置為 Datagrid 中的當前選定項

[英]WPF MVVM: Set focus to current selected item in Datagrid on button click

我在 Visual Studio 2008 和 NET Framework 3.5 SP1 中有一個 MVVM WPF 應用程序。 在其他控件中,這個應用程序有一個數據網格和一個按鈕。

按鈕

<Button Grid.Column="1" Command="{Binding CalculateCommand}" FocusManager.FocusedElement="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="True" />                
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=myDataGrid, Path=SelectedItem}" Value="{x:Null}">
                    <Setter Property="IsEnabled" Value="False" />                        
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
        <Image VerticalAlignment="Center" Source="/MyWPFApp;component/Images/Calculate.png"></Image>
        <TextBlock VerticalAlignment="Center">Calculate</TextBlock>
    </StackPanel>
</Button>

我想要做的是在單擊按鈕后將焦點設置在數據網格中的當前選定項目上,因此當我單擊鍵盤中的向上/向下箭頭鍵時,我可以移動到數據網格中的任何其他項目。

所以我試圖在按鈕中設置FocusManager.FocusedElement屬性,但它不起作用。 我也嘗試按原樣設置而不指定路徑:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid}"

在第一次嘗試中,沒有在屬性中設置 Path:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid}"

當我單擊鍵盤中向上箭頭鍵的向下鍵時(單擊按鈕后),它會將焦點更改為 UI 中不是數據網格中當前所選項目的另一個控件。

在第二次嘗試中,在屬性中設置 Path:

FocusManager.FocusedElement="{Binding ElementName=myDataGrid, Path=SelectedItem}"

它只是什么都不做,在數據網格中的當前選定項或任何其他控件中都沒有焦點。

我也試過這里所說的附加行為,但它不起作用:

<Button Grid.Column="1" Command="{Binding CalculateCommand}" classes:EventFocusAttachment.ElementToFocus="{Binding ElementName=myDataGrid}" HorizontalAlignment="Right">

另一種嘗試

它適用於第二次按鍵,第一次點擊被忽略。

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        if (myDataGrid.SelectedIndex > -1)
        {
            var selectedRow = (Microsoft.Windows.Controls.DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex);
            FocusManager.SetIsFocusScope(selectedRow, true);
            FocusManager.SetFocusedElement(selectedRow, selectedRow);
        }
   }

@Evk 解決方案完美運行。

以下應該工作:

if (myDataGrid.SelectedIndex > -1) {
    var container = (DataGridRow) myDataGrid.ItemContainerGenerator.ContainerFromIndex(myDataGrid.SelectedIndex);
    if (container != null) {
        container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }
}

您可以將該代碼放入Button.Click事件(這里沒有錯,我們所做的完全是僅查看的事情),或者如果您不喜歡代碼隱藏,您可以從中創建附加屬性\\行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM