C# ItemsControl在属性值更改后不立即更新
我有以下测试代码 XAML:C# ItemsControl在属性值更改后不立即更新,c#,xaml,uwp,C#,Xaml,Uwp,我有以下测试代码 XAML: 代码隐藏: namespace Test { public class MyData : INotifyPropertyChanged { private string firstName; public string FirstName { get { return firstName; } set { firstName = value; OnPr
代码隐藏:
namespace Test
{
public class MyData : INotifyPropertyChanged
{
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; OnPropertyChanged("FirstName"); }
}
private string surName;
public string Surname
{
get { return surName; }
set { surName = value; OnPropertyChanged("Surname"); }
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public class LoadData
{
public static void Get_RowItems(ObservableCollection<MyData> Items)
{
Items.Add(new MyData() { FirstName = "John", Surname = "Doe" });
}
}
public sealed partial class MainPage : Page
{
private ObservableCollection<MyData> RowItems;
public MainPage()
{
this.InitializeComponent();
RowItems = new ObservableCollection<MyData>();
LoadData.Get_RowItems(RowItems);
}
private void StartButton_Click(object sender, RoutedEventArgs e)
{
RowItems[0].FirstName = "Bill";
RowItems[0].Surname = "Smith";
}
}
}
名称空间测试
{
公共类MyData:INotifyPropertyChanged
{
私有字符串名;
公共字符串名
{
获取{return firstName;}
设置{firstName=value;OnPropertyChanged(“firstName”);}
}
私家姓;
公共字符串姓氏
{
获取{返回姓氏;}
集合{姓氏=值;OnPropertyChanged(“姓氏”);}
}
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
公共类装入数据
{
公共静态无效获取行项目(可观察集合项目)
{
添加(新的MyData(){FirstName=“John”,姓氏=“Doe”});
}
}
公共密封部分类主页面:第页
{
私人可观测收集项目;
公共主页()
{
this.InitializeComponent();
RowItems=新的ObservableCollection();
LoadData.Get_RowItems(RowItems);
}
私有无效开始按钮单击(对象发送者,路由目标)
{
行项目[0]。FirstName=“比尔”;
行项目[0]。姓氏=“史密斯”;
}
}
}
虽然运行这个看起来不错,但ItemsControl仅在StartButton_Click事件处理程序完成后更新,但我需要在StartButton_Click事件处理程序内的每个属性值更改时更新它
在开始按钮按下之前,点击显示“John Doe”
作为行项目[0]。FirstName=“Bill”;完成显示后,应显示“Bill Doe”
在行项目[0]之后。姓氏=“Smith”;完成显示时应显示“Bill Smith”
即,我需要在属性值更改后立即更改显示
任何帮助都将不胜感激。正如我上面所说,您的代码看起来很正确。显示器以异步方式呈现,因此可能只是更新被批处理在一起。你能试试这样的东西吗
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
RowItems[0].FirstName = "Bill";
await Task.Delay(2000);
RowItems[0].Surname = "Smith";
}
设置第一个名称后,此操作将暂停2秒钟。我猜你会看到“比尔·多伊”两秒钟,然后是“比尔·史密斯”
如果是这样的话,那么一切基本上都按预期进行。在这种情况下,你需要更多地解释你想要发生什么。如果显示屏显示“Bill Doe”几秒钟,然后显示“Bill Smith”,那么如果它的更新速度比您看到的要快呢?这里的代码/XAML看起来是正确的。你能给我们看看StartButton_Click()中的代码吗?@gregstoll-它应该在那里,在代码隐藏(向下滚动)窗格的底部。哈,对不起,我错过了!你好,格雷格斯托尔。是的,这很管用。我在处理程序末尾使用断点测试它,但什么也没发生。但是,添加'async'和'await…'并在之后放置一个断点确实会改变。非常感谢。哦,对其他用户来说,这需要“使用System.Threading.Tasks;”
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
RowItems[0].FirstName = "Bill";
await Task.Delay(2000);
RowItems[0].Surname = "Smith";
}