I currently have a problem with my code, where there will be no focus on a particular line of the element. I created int focusReferenceto track the current focused line, but every couple of seconds it is displayed as reset to 0, that is, as soon as the user selects the line, after a couple of seconds he "forgets" the users selection. I gave an example below:


As you can see from my code below, I have a timer doing something every few seconds. I have already been told that updating my list every few seconds leads to a loss of focus every few seconds.
, , ? FocusItem, , , . , , , (, , ) :
public MainWindow()
{
InitializeComponent();
int focusReference = 0;
PlotListView.SelectionChanged += (s, ee) => { PlotListView_SelectionChanged(s, ee, focusReference); };
var dbObject = new DbConnect();
dbObject.OpenConnection();
RefreshPlotTimer(filterReference, focusReference);
}
public void PlotListView_SelectionChanged(object sender, SelectionChangedEventArgs e, int focusReference)
{
if (PlotListView.SelectedItems.Count == 0) return;
var selectedItem = (DbConnect.PlotList)PlotListView.SelectedItems[0];
focusReference = Convert.ToInt32(selectedItem.PlotId);
FocusItem(focusReference);
}
private void FocusItem(int focusReference)
{
if (PlotListView.SelectedItems.Count != 0)
{
DbConnect.PlotList plotList =
PlotListView.Items.OfType<DbConnect.PlotList>()
.FirstOrDefault(p => Convert.ToInt32(p.PlotId) == focusReference);
if (plotList != null)
{
var container = PlotListView.ItemContainerGenerator.ContainerFromItem(plotList) as ListViewItem;
if (container != null)
{
container.IsSelected = true;
container.Focus();
}
}
}
}
public void RefreshPlotTimer(int filterReference, int focusReference)
{
var refreshTimer = new Timer();
refreshTimer.Elapsed += (sender, e) => RefreshPlot(sender, e, filterReference, focusReference);
refreshTimer.Interval = 2500;
refreshTimer.Enabled = true;
}
public void RefreshPlot(object source, ElapsedEventArgs e, int filterReference, int focusReference)
{
var dbObject = new DbConnect();
dbObject.OpenConnection();
dbObject.RefreshPlot();
Dispatcher.Invoke(() =>
{
FocusItem(focusReference);
if (!string.IsNullOrWhiteSpace(FilterTextBox.Text) &&
(!Regex.IsMatch(FilterTextBox.Text, "[^0-9]")))
{
filterReference = Convert.ToInt32(FilterTextBox.Text);
}
});
ResetPlot(filterReference);
}
public void ResetPlot(int filterReference)
{
var dbObject = new DbConnect();
dbObject.OpenConnection();
List<DbConnect.PlotList> plotList = dbObject.SelectPlotLists(filterReference);
Dispatcher.BeginInvoke(
new ThreadStart(() => PlotListView.ItemsSource = plotList));
int jobSum = 0;
int bidSum = 0;
foreach (DbConnect.PlotList item in PlotListView.Items)
{
jobSum += Convert.ToInt32(item.Jobs);
bidSum += Convert.ToInt32(item.Bids);
}
Dispatcher.BeginInvoke(
new ThreadStart(() => JobBidRatioTextBlock.Text = jobSum + " jobs - " + bidSum + " bids"));
}
2
, , , FocusItem ?
private void FocusItem(int focusReference)
{
Dispatcher.Invoke(() =>
{
if (PlotListView.SelectedItems.Count != 0)
{
DbConnect.PlotList plotList =
PlotListView.Items.OfType<DbConnect.PlotList>()
.FirstOrDefault(p => Convert.ToInt32(p.PlotId) == focusReference);
if (plotList != null)
{
var container = PlotListView.ItemContainerGenerator.ContainerFromItem(plotList) as ListViewItem;
if (container != null)
{
container.IsSelected = true;
container.Focus();
}
}
}
}
}
, , , .
PlotListView_SelectionChanged 4
Before refresh 4
After refresh 4
PlotListView_SelectionChanged 7
Before refresh 7
After refresh 7
Before refresh 7
After refresh 7
refresh plot...
public void RefreshPlot(object source, ElapsedEventArgs e)
{
var dbObject = new DbConnect();
dbObject.OpenConnection();
dbObject.RefreshPlot();
Console.WriteLine("\rBefore refresh " + focusReference);
Dispatcher.Invoke(() =>
{
if (!string.IsNullOrWhiteSpace(FilterTextBox.Text) &&
(!Regex.IsMatch(FilterTextBox.Text, "[^0-9]")))
{
filterReference = Convert.ToInt32(FilterTextBox.Text);
}
});
ResetPlot(filterReference);
Console.WriteLine("After refresh " + focusReference);
FocusItem(focusReference);
}
reset...
public void ResetPlot(int filterReference)
{
var dbObject = new DbConnect();
dbObject.OpenConnection();
List<DbConnect.PlotList> plotList = dbObject.SelectPlotLists(filterReference);
Dispatcher.BeginInvoke(
new ThreadStart(() => PlotListView.ItemsSource = plotList));
int jobSum = 0;
int bidSum = 0;
foreach (DbConnect.PlotList item in PlotListView.Items)
{
jobSum += Convert.ToInt32(item.Jobs);
bidSum += Convert.ToInt32(item.Bids);
}
FocusItem(focusReference);
Dispatcher.BeginInvoke(
new ThreadStart(() => JobBidRatioTextBlock.Text = jobSum + " jobs - " + bidSum + " bids"));
}