ご質問にお答えしたlinkに基づき、私はこれを解決する方法を見つけました。私の解決策ではDataGridCell
がTextBox
の文字列と一致すると、Tag
のプロパティが "1"に設定され、Button
がクリックされると、すべてDataGridCells
を反復してnull以外の項目が見つかるTags
、最後にハイライトされたセル1つずつフォーカスされます。
XAML:
<Window Name="UI">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel DataContext="{Binding ElementName=UI}" Grid.Row="0">
<TextBox Name="SearchBox" TextChanged="SearchBox_TextChanged"/>
<DataGrid x:Name="grid"
m:DataGridTextSearch.SearchValue="{Binding ElementName=SearchBox, Path=Text, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding TestData}"
SelectionUnit="Cell">
<DataGrid.Resources>
<m:SearchValueConverter x:Key="SearchValueConverter" />
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="m:DataGridTextSearch.IsTextMatch">
<Setter.Value>
<MultiBinding Converter="{StaticResource SearchValueConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="Content.Text" />
<Binding RelativeSource="{RelativeSource Self}" Path="(m:DataGridTextSearch.SearchValue)" />
</MultiBinding>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="m:DataGridTextSearch.IsTextMatch" Value="True">
<Setter Property="Background" Value="Orange" />
<Setter Property="Tag" Value="1" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
</StackPanel>
<Button Grid.Row="1" Click="Button_Click" Content="GoNext"/>
</Grid>
</Window>
MainWindow.cs:
int currentIndex = 0;
private void SearchBox_TextChanged(object sender, TextChangedEventArgs e)
{
currentIndex = 0;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var selectedCells = GetHighLightedCells();
if (selectedCells.Count == 0)
return;
selectedCells[currentIndex].Focus();
if (currentIndex == selectedCells.Count - 1)
currentIndex = 0;
else
currentIndex++;
}
は、メソッドのセルを強調表示するには:ここで
はあなたのアイデアを与えるために実施例であります
public List<DataGridCell> GetHighLightedCells()
{
List<DataGridCell> selectedCells = new List<DataGridCell>();
foreach (DataGridRow rowContainer in GetDataGridRows())
{
if (rowContainer != null)
{
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
foreach (var col in grid.Columns)
{
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(col.DisplayIndex);
if (cell == null)
{
grid.ScrollIntoView(rowContainer, col);
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(col.DisplayIndex);
}
if (cell.Tag != null)
{
selectedCells.Add(cell);
}
}
}
}
return selectedCells;
}
public IEnumerable<DataGridRow> GetDataGridRows()
{
var itemsSource = grid.ItemsSource as IEnumerable;
if (null == itemsSource) yield return null;
foreach (var item in itemsSource)
{
var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (null != row) yield return row;
}
}
public static T GetVisualChild<T>(Visual parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
素晴らしい。私は実際に同様の行に沿って何かをしていましたが、それは私を永遠に解決してくれました。感謝します!ありがとうございました。 – Finch042
あなたは大歓迎です:) –