這是我的 DataGrid 測驗代碼。我使用 ObservableCollection 在 DataGrid 源上設定了一些資料并系結了它。我修改了 ObservableCollection 成員屬性的值。在這種情況下,我的 UI 必須顯示值已更改。但是,我的 DataGrid 僅在我選擇單元格時進行互動。
捆綁
public ObservableCollection<MyClass> griddata { get; set; } = new ObservableCollection<MyClass>();
我的課
public class MyClass
{
public int num { get; set; }
public int idxnumber { get; set; }
}
XAML
<Grid>
<DataGrid ItemsSource="{Binding griddata, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
</DataGrid>
</Grid>
功能
//... griddata.add(someOfData);
public void ViewModel()
{
int i = 0;
while(i < 30)
{
testing(0);
i ;
}
}
private void testing(int idxnum)
{
var test = griddata.Where(z => z.idxnumber == idxnum).FirstOrDefalut();
test.num = 1;
}
結果
單元格值顯示,0我選擇的值30立即更改為。
期望結果
的單元格值示出了0對30連續進行。
編輯:
這是我的整個代碼:
XAML
<Window x:Class="TestSol3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestSol3"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid>
<DataGrid ItemsSource="{Binding griddata}">
</DataGrid>
</Grid>
</Window>
模型.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestSol3
{
public class Model
{
public int num { get; set; }
public int idxnumber { get; set; }
}
}
視圖模型.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace TestSol3
{
public class ViewModel
{
public ObservableCollection<Model> griddata { get; set; } = new ObservableCollection<Model>();
public ViewModel()
{
griddata.Add(new Model() { num = 0, idxnumber = 0 });
griddata.Add(new Model() { num = 1, idxnumber = 1 });
Load(0);
}
private void Load(int idxnum)
{
int i = 0;
while(i < 30)
{
i ;
griddata[idxnum].num ;
//Thread.Sleep(200);
}
}
}
}
uj5u.com熱心網友回復:
嘗試在您的模型中實作 INotifyPropertyChanged
namespace TestSol3
{
public class ViewModel : INotifyPropertyChanged
{
public ObservableCollection<Model> _griddata = new ObservableCollection<Model>();
public ObservableCollection<Model> griddata
{
get => _griddata;
set
{
_griddata= value;
OnChangedProperty("griddata");
}
}
public void OnChangedProperty(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}
uj5u.com熱心網友回復:
[解決方案]
在 WPF 中,您可以dispatcher從Application.Current.Dispatcher
如何將 UI Dispatcher 傳遞給 ViewModel
并且我們需要更改專案ObservableCollection以通知值更改事件。
的檔案ObservableCollection說:
表示動態資料集合,在添加、洗掉專案或重繪 整個串列時提供通知。
https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1?view=net-6.0
private void Load(int idxnum)
{
Task.Run(() =>
{
int i = 0;
while (i < 30)
{
i ;
var model = griddata[idxnum];
model.num ;
var dispatcher = Application.Current.Dispatcher;
dispatcher.Invoke(() =>
{
griddata.RemoveAt(idxnum);
griddata.Insert(idxnum, model);
});
Thread.Sleep(500);
}
});
}
【簡單演示】
我寫了一個演示專案來展示如何持續更新 UI 值,如下所示。
它用于Task啟動另一個執行緒來更新 UI 值,希望它有所幫助。
主視窗.xaml
<Window x:Class="TestWpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<StackPanel>
<TextBlock Name="MyTextBlock" FontSize="20"></TextBlock>
<Button Click="Button_Click">Start</Button>
</StackPanel>
</Window>
主視窗.xaml.cs
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace TestWpfApp
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private Task? CurrentTask { get; set; }
private void Button_Click(object sender, RoutedEventArgs e)
{
// only one task is supported simultaneously
if (this.CurrentTask != null
&& !this.CurrentTask.IsCompleted)
{
return;
}
// start a task to calculate value continuously
this.CurrentTask = Task.Run(() =>
{
int i = 0;
while (i < 30)
{
i;
Thread.Sleep(500);
// update value in the UI thread
this.Dispatcher.Invoke(() =>
{
this.MyTextBlock.Text = i.ToString();
});
}
});
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/383552.html
上一篇:如何從目錄中獲取特定的檔案名模式
