首先感谢我的老王同学,给了我很大的帮助,再次献上诚挚的敬意!
工作中有一个需求,是搜索关键词跳转到指定行,控件用的是dev的,之前一直没用过,第一反应是datagrid ListView里面的.ScrollIntoView()方法,然后找了下dev里面的方法,发现.View.MoveFocusedRow()方法可以实现,括号里面写的是行号,但我之前一直用的都不是MVVM,都是直接 控件名.ScrollIntoView()来实现这个功能,我试了下 控件名.View.MoveFocusedRow()确实也能实现跳转,但是具体MVVM要怎么绑定这个控件对象的时候,懵逼了,百度搜了一天没解决(如果有能解决的欢迎留言!!!)在隔壁老王的帮助下,换了种思路,直接绑定SelectedItem,通过更改选择项实现跳转。
特别提醒!dev前端有一个SelectionMode的属性,必须设置成None或者删除才能实现跳转功能
下面简单贴一下代码
前端:
<Window
x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:local="clr-namespace:WpfApplication3"
Title="MainWindow"
Width="525"
Height="350">
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Grid>
<dxg:GridControl
Width="399"
Height="203"
Margin="37,36,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
AutoGenerateColumns="AddNew"
EnableSmartColumnsGeneration="True"
ItemsSource="{Binding DemoList}"
SelectedItem="{Binding SelectedItem}">
<dxg:GridControl.View>
<dxg:TableView ShowTotalSummary="True" />
</dxg:GridControl.View>
</dxg:GridControl>
<TextBox
Width="221"
Height="33"
Margin="10,260,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="{Binding SearchStr}"
TextWrapping="Wrap" />
<Button
Width="117"
Height="37"
Margin="308,260,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Command="{Binding Command}"
Content="Button" />
</Grid>
</Window>
后端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace WpfApplication3
{
public class DemoDataClass
{
public string Name { get; set; }
public string Var0 { get; set; }
public string Var1 { get; set; }
}
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public List<DemoDataClass> DemoList { get; set; }
private DemoDataClass selecteditem;
public DemoDataClass SelectedItem
{
get { return selecteditem; }
set
{
selecteditem = value;
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("SelectedItem"));
}
}
}
private string searchstr;
public string SearchStr
{
get { return searchstr; }
set
{
if (searchstr != value)
{
searchstr = value;
search();
}
}
}
public MainViewModel()
{
DemoList = new List<DemoDataClass>();
for (int i = 0; i < 1000; i++)
{
DemoList.Add(new DemoDataClass() { Name = "aa" + i.ToString(), Var0 = "bb" + i.ToString(), Var1 = "cc" + i.ToString() });
}
Console.WriteLine("haha");
}
private void search()
{
Console.WriteLine("search " + SearchStr);
int i = 0;
foreach (DemoDataClass data in DemoList)
{
if (data.Name == SearchStr)
{
break;
}
i++;
}
if (DemoList.Count > i) SelectedItem = DemoList[i];
}
public ICommand command;
public ICommand Command
{
get
{
return command;
}
set
{
command = value;
search();
}
}
}
}
界面:
实现效果: