Code: Select all
MyDataGrid.CurrentCell = new DataGridCellInfo(myViewModel, PunktzahlColumn);
MyDataGrid.BeginEdit();
< /code>
Dieser Code wird ausgeführt, nachdem der Benutzer etwas in ein Suchtextfeld über dem Raster eingeleitet hat. Die text
Code: Select all
this.WhenAnyValue(x => x.SearchText)
.Throttle(TimeSpan.FromMilliseconds(300))
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => searchAndFocus());
Code: Select all
Dispatcher.InvokeAsync(() =>
{
var cellContent = PunktzahlColumn.GetCellContent(MyDataGrid.CurrentItem);
if (cellContent != null)
{
var textBox = FindVisualChild(cellContent);
textBox?.Focus();
}
});
Mainwindow.xaml:
< /code>
Mainwindow.xaml.cs:
using System.Windows;
using System.Windows.Controls;
namespace WpfApp1;
public partial class MainWindow : Window
{
private readonly MainWindowViewModel mainWindowViewModel;
public MainWindow()
{
InitializeComponent();
mainWindowViewModel = new MainWindowViewModel();
mainWindowViewModel.FocusRequested += OnFocusRequested;
this.DataContext = mainWindowViewModel;
}
private void MyDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if (e.Column == PunktzahlColumn && e.EditAction == DataGridEditAction.Commit && SearchTextBox.Text.Length > 0)
{
SearchTextBox.Focus();
mainWindowViewModel.SearchText = string.Empty;
}
}
private void OnFocusRequested(MyViewModel myViewModel)
{
MyDataGrid.UnselectAllCells();
MyDataGrid.CurrentCell = new DataGridCellInfo(myViewModel, PunktzahlColumn);
MyDataGrid.BeginEdit();
}
}
< /code>
MainwindowViewModel.cs
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using System.Collections.ObjectModel;
using System.Reactive.Linq;
using System.Windows;
namespace WpfApp1;
public class MainWindowViewModel : ReactiveObject
{
private ObservableCollection myViewModels;
public IEnumerable MyViewModels => myViewModels;
public event Action? FocusRequested;
[Reactive]
public string? SearchText { get; set; }
public MainWindowViewModel()
{
myViewModels = new ObservableCollection();
for (int i = 0; i < 10; i++)
{
myViewModels.Add(new MyViewModel($"Name {i}", i * 10, $"Kommentar {i}"));
}
this.WhenAnyValue(x => x.SearchText)
.Throttle(TimeSpan.FromMilliseconds(300))
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => searchAndFocus());
}
private void searchAndFocus()
{
if (string.IsNullOrWhiteSpace(SearchText))
{
return;
}
var matches = MyViewModels
.Where(b => b.Name.Contains(SearchText, StringComparison.OrdinalIgnoreCase))
.ToList();
if (matches.Count == 1)
{
// Set focus with delay
Application.Current.Dispatcher.InvokeAsync(() =>
{
FocusRequested?.Invoke(matches[0]);
});
}
}
}
< /code>
MyViewModel.cs:
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
namespace WpfApp1;
public class MyViewModel : ReactiveObject
{
[Reactive]
public string Name { get; set; }
[Reactive]
public int? Punktzahl { get; set; }
[Reactive]
public string? Kommentar { get; set; }
public MyViewModel(string name, int? punktzahl, string? kommentar)
{
Name = name;
Punktzahl = punktzahl;
Kommentar = kommentar;
}
}
< /code>
Abhängigkeiten: < /p>
ReactiveUi Version 20.2.45 < /li>
ReactiveUi.FODY Version 19.5.41 < /li>
öten>