【问题标题】:Initial Focus on selected ListViewItem选定 ListViewItem 的初始焦点
【发布时间】:2016-05-26 07:27:21
【问题描述】:

我有一个简单的 MVVM 对话框,只有一个 ListView 和两个按钮(确定、取消)和一个负责绑定 ListView 的 ItemsSource 和 SelectedItem 的 ViewModel。

查看:

...
<StackPanel>
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <ListView ItemsSource="{Binding Projects}" SelectedItem="{Binding Project}" SelectionMode="Single">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ScrollViewer>
    <StackPanel Orientation="Horizontal" FlowDirection="RightToLeft">
        <Button Content="Cancel" IsCancel="True"/>
        <Button Content="Ok" Command="{Binding OkCommand}" CommandParameter="{Binding ElementName=Dlg}"/>
    </StackPanel>
</StackPanel>
...

视图模型:

public class SelectProjectViewModel : ViewModelBase, IModalDialogViewModel
{
    private readonly ProjectList _projectList;
    public ProjectList Projects => _projectList;

    public Project Project
    {
        get { return GetValue(() => Project); }
        set { SetValue(() => Project, value);}
    }

    private RelayCommand _okCommand;
    public RelayCommand OkCommand => _okCommand ?? (_okCommand = new RelayCommand(OkCommandCall));

    public SelectProjectViewModel(ProjectList projectList, Project currentProject)
    {
        _projectList = projectList;
        this.Project = currentProject;
    }

    private void OkCommandCall(object window)
    {
        DialogResult = true;
        WindowCloseBehaviour.SetClose(window as DependencyObject, true);
    }

    public bool? DialogResult
    {
        get { return GetValue(() => DialogResult); }
        private set { SetValue(() => DialogResult, value); }
    }
}

我试图通过接受的解决方案和等效的行为类来实现像here 中描述的那样聚焦第一个元素。但这总是将焦点设置在取消按钮上,而我希望我的 ListView 在打开对话框时得到焦点,以便真正突出显示所选元素,而不仅仅是“非活动突出显示”颜色。不,我不想改变颜色。

【问题讨论】:

  • 你用过FocusManager.FocusedElement by element binding吗?
  • icebat 的回答也暗示了这一点,但这扼杀了我最初的选择

标签: c# wpf user-interface mvvm data-binding


【解决方案1】:

在父级上使用简单的FocusedElement 并在 ListView 上使用SelectedIndex 本身对我有用:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=myListView}">
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <ListView Name="myListView" ItemsSource="{Binding Projects}" SelectedItem="{Binding Project}" SelectionMode="Single"
                  SelectedIndex="0">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ScrollViewer>
    ...
    </StackPanel>
</StackPanel>

【讨论】:

  • @FlorianKoch,我模仿了您的示例,并且绑定对我来说可以正常工作。所选项目绑定到代码中的一组和全部。怎么破?
  • 我有一个预先选择的列表视图项,当我使用您的代码时,第一次打开对话框时的选择消失了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多