【发布时间】: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