初始关注选定的ListViewItem

时间:2016-02-15 11:42:47

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

我有一个简单的MVVM对话框,只有一个ListView和两个按钮(Ok,Cancel)和一个负责绑定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会被聚焦,这样所选的元素就会被突出显示,而不仅仅是在&#34;非活动的高亮显示中#34;颜色。不,我不想改变颜色。

1 个答案:

答案 0 :(得分:0)

在ListView上使用FocusedElement的父级上的简单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>