C# ItemsControl在属性值更改后不立即更新

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

我有以下测试代码

XAML:


代码隐藏:

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";
    }