Wpf 为什么在动态更改数据时MVVM不工作?

Wpf 为什么在动态更改数据时MVVM不工作?,wpf,vb.net,xaml,mvvm,Wpf,Vb.net,Xaml,Mvvm,我的xaml: <Window x:Class="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"

我的xaml:

<Window x:Class="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:TestMetroChartsVB"        
        xmlns:chart="clr-namespace:GravityApps.Mandelkow.MetroCharts;assembly=GravityApps.Mandelkow.MetroCharts"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:TestPageViewModel/>
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <chart:ClusteredBarChart ChartTitle="Example1 " ChartSubTitle="Test1">
                <chart:ClusteredBarChart.Series>
                    <chart:ChartSeries SeriesTitle="Errors" ItemsSource="{Binding Errors}"
                                       DisplayMember="Category" ValueMember="Number"/>
                </chart:ClusteredBarChart.Series>                    
            </chart:ClusteredBarChart>
            <Button x:Name="btnTest" Height="31" Margin="0,0,405,0" Content="Change Data"/>
        </StackPanel>    
    </Grid>
</Window>
我的viewModel:

导入System.Collections.ObjectModel
公共类TestPageViewModel
公共属性错误()作为(TestClass的)ObservableCollection
得到
返回m_错误
结束
专用设备
m_误差=值
端集
端属性
私有m_错误作为(TestClass的)ObservableCollection
公共分新()
错误=新的ObservableCollection(属于TestClass)
添加(新的TestClass(“Data1”,5))
添加(新的TestClass(“Data2”,10))
添加(新的TestClass(“Data5”,15))
端接头
公共子数据()
错误。清除()
添加(新的TestClass(“DAta9”,10))
端接头
末级
我的模型:

公共类TestClass
作为字符串的公共属性类别
得到
返回m_类别
结束
设置(值为字符串)
m_类别=价值
端集
端属性
私有m_类别作为字符串
公共属性号为整数
得到
返回m_编号
结束
设置(值为整数)
m_数=值
端集
端属性
私有m_数为整数
Public Sub New(类别为字符串,数字为整数)
Me.Category=类别
我。数字=数字
端子端类
它最初显示的数据如下所示:

但当我点击我的“更改数据”按钮时,数据不会更改吗?
有什么问题吗?

您更改了错误的数据:

Private Sub btnTest\u Click(发送方作为对象,e作为RoutedEventArgs)处理btnTest。单击
Dim测试作为新的TestPageViewModel
test.changeData()
端接头
在按钮的
单击
事件处理程序中,创建一个新的视图模型对象,并在其上调用
changeData()
。但这不是视图正在使用的视图模型对象,也没有做任何事情使其成为视图正在使用的视图模型对象

最好的方法是获取实际的视图模型并更改该模型:

Private Sub btnTest\u Click(发送方作为对象,e作为RoutedEventArgs)处理btnTest。单击
Dim view As Button=CType(发送器,按钮)
Dim测试为TestPageViewModel=CType(view.DataContext,TestPageViewModel)
test.changeData()
端接头

上面假设发送单击事件的
按钮继承了
主窗口的数据上下文。

对于其中一个,ViewModel类没有实现
INotifyPropertyChanged
,这是通知视图绑定的ViewModel中的数据已更改的内容。@Nkosi:他没有更改任何属性在视图模型中,只有
ObservableCollection
对象中的数据,该对象根据需要实现了
INotifyCollectionChanged
。@PeterDuniho您是对的。我错过了OP在事件处理程序中创建新ViewModel的过程。在代码隐藏中,该功能应该移到命令而不是事件处理程序中,但这完全是另一个主题。在实现MVVM时,有没有简单的方法可以通过用户引发的事件更改UI中显示的数据?@PankajPotdar:在注释中尝试解释有点宽泛,但是。。。几乎所有MVVM实现的基础都是
INotifyPropertyChanged
ICommand
。前者提供模型数据更改的UI更新,而后者提供接收用户输入。用户输入可能导致调用
ICommand.Execute()
,这反过来会更改模型中的某些值,从而引发
INotifyPropertyChanged.PropertyChanged
事件,这允许UI根据新值更新自身。请更正我的错误,因为我使用的是observable collection,不需要更改inotifyproperty,对吗?您能否举例说明当用户提供输入时更新UI上数据的最佳方法?@Pankaj:如果您使用的集合实现了
INotifyCollectionChanged
(这是
ObservableCollection
所做的),那么您唯一关心的就是对集合的更改(即集合中各个元素的属性值不变),那么是的……这就足够了。我不能给出“最佳方式”的示例更新数据;这在很大程度上取决于您的意思。在UI上更新数据应该始终通过将视图模型属性绑定到UI属性来实现,但如何接受用户输入和修改视图模型属性取决于特定的场景。