C# WPF MVVM数据网格导航
我想就这个问题寻求帮助。 我的目标是为datagrid准备导航控件,就像在WinForms中一样。 上移,下移一行,上移一行,下移一行,跳转到行(按数字) 我用xaml制作了一些解决方案:C# WPF MVVM数据网格导航,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我想就这个问题寻求帮助。 我的目标是为datagrid准备导航控件,就像在WinForms中一样。 上移,下移一行,上移一行,下移一行,跳转到行(按数字) 我用xaml制作了一些解决方案: <GroupBox x:Name="gbInfo" BorderBrush="Black" BorderThickness="1" Margin="4"
<GroupBox x:Name="gbInfo"
BorderBrush="Black"
BorderThickness="1"
Margin="4"
Header="Info">
<StackPanel Orientation="Horizontal"
VerticalAlignment="Center">
<Button Content="<<"
Command="{Binding CmdMoveUpDown}"
CommandParameter="Down"/>
<TextBlock Text="{Binding InfoTable}"
VerticalAlignment="Center"/>
<Button Content=">>"
Command="{Binding CmdMoveUpDown}"
CommandParameter="Up"/>
</StackPanel>
</GroupBox>
<DataGrid x:Name="dgrForPrijem"
Margin="5"
ItemsSource="{Binding TabulkaPrijmu}"
AutoGenerateColumns="False"
AlternationCount="2"
SelectionMode="Single
CanUserAddRows="False"
SelectedItem="{Binding MySelectedItem}"
IsReadOnly="True" >
<intr:Interaction.Behaviors>
<atch:ScrollIntoViewBahaviour/>
</intr:Interaction.Behaviors>
<DataGrid.Columns>
<DataGridTextColumn x:Name ="dgtcForDpr"
Header="ID Car"
Width="80*"
Binding="{Binding DPR}" />
<DataGridTextColumn x:Name="dgtcForIdDpr"
Header="Type of Car"
Width="40*"
Binding="{Binding ID_DPR}" />
<DataGridTextColumn x:Name="dgtcForIdStav"
Header="Status"
Width="60*"
Binding="{Binding ID_STAV}"/>
</DataGrid.Columns>
</DataGrid>
当你尝试排序时,问题到底是什么?我对datagrid进行排序。所有行都已排序。但当我单击第一行(在datagrid中)时,它的示例是observable集合中的30项——indexOf(SelectedItem)是30。
public class VMIndexMaterialIncome : ViewModelBase
{
public VMIndexMaterialIncome()
{
TabulkaPrijmu = new ObservableCollection<TMaterialIncome>(new MaterialSupplyServices().ProvideAllMaterialIncomes());
}
private TMaterialIncome mySelectedItem;
public TMaterialIncome MySelectedItem
{
get
{
return mySelectedItem;
}
set
{
mySelectedItem = value;
InfoTable = TabulkaPrijmu.IndexOf(mySelectedItem).ToString();
NotifyPropertyChanged("MySelectedItem");
}
}
private string infoTable;
public string InfoTable
{
get { return infoTable; }
set
{
infoTable = value;
NotifyPropertyChanged("InfoTable");
}
}
public ICommand CmdMoveUpDown
{
get
{
return new RelayCommand<object>((object obj) =>
{
if (TabulkaPrijmu != null)
{
int myIndex = TabulkaPrijmu.IndexOf(MySelectedItem);
switch(obj.ToString())
{
case "Up":
if (myIndex < (TabulkaPrijmu.Count - 1))
myIndex++;
break;
case "Down":
if (myIndex > 0)
myIndex--;
break;
default:
break;
}
MySelectedItem = TabulkaPrijmu[myIndex];
}
});
}
}
private ObservableCollection<TMaterialIncome> tabulkaPrijmu;
public ObservableCollection<TMaterialIncome> TabulkaPrijmu
{
get
{
return tabulkaPrijmu;
}
set
{
tabulkaPrijmu = value;
NotifyPropertyChanged("TabulkaPrijmu");
}
}
}
}
public class ScrollIntoViewBahaviour : Behavior<DataGrid>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SelectionChanged += new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is DataGrid)
{
DataGrid grid = (sender as DataGrid);
if (grid.SelectedItem != null)
{
Action action = delegate () {
grid.UpdateLayout();
grid.ScrollIntoView(grid.SelectedItem, null);
grid.Focus(); // added this to make it focus to the grid
};
grid.Dispatcher.BeginInvoke(action);
}
}
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.SelectionChanged -=
new SelectionChangedEventHandler(AssociatedObject_SelectionChanged);
}
}