当我动态更改数据时,为什么我的MVVM不起作用?

时间:2016-09-04 13:58:37

标签: 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"
        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>

我的观点:

Imports GravityApps.Mandelkow.MetroCharts Class MainWindow

Private Sub btnTest_Click(sender As Object, e As RoutedEventArgs) Handles btnTest.Click
    Dim test As New TestPageViewModel
    test.changeData()
End Sub End Class

我的viewModel:

Imports System.Collections.ObjectModel

Public Class TestPageViewModel

    Public Property Errors() As ObservableCollection(Of TestClass)
        Get
            Return m_Errors
        End Get
        Private Set
            m_Errors = Value
        End Set
    End Property
    Private m_Errors As ObservableCollection(Of TestClass)
    Public Sub New()
        Errors = New ObservableCollection(Of TestClass)
        Errors.Add(New TestClass("Data1", 5))
        Errors.Add(New TestClass("Data2", 10))
        Errors.Add(New TestClass("Data5", 15))
    End Sub

    Public Sub changeData()
        Errors.Clear()
        Errors.Add(New TestClass("DAta9", 10))
    End Sub

End Class

我的模特:

Public Class TestClass
    Public Property Category As String
        Get
            Return m_Category
        End Get
        Set(value As String)
            m_Category = value
        End Set
    End Property
    Private m_Category As String
    Public Property Number As Integer
        Get
            Return m_Number
        End Get
        Set(value As Integer)
            m_Number = value
        End Set
    End Property
    Private m_Number As Integer

    Public Sub New(category As String, number As Integer)
        Me.Category = category
        Me.Number = number
    End Sub End Class

它最初显示的数据如下: enter image description here

但是当我点击我的&#34;更改数据&#34;按钮数据不会改变? 问题是什么?

1 个答案:

答案 0 :(得分:1)

您正在更改错误的数据:

Private Sub btnTest_Click(sender As Object, e As RoutedEventArgs) Handles btnTest.Click
    Dim test As New TestPageViewModel
    test.changeData()
End Sub

在按钮的Click事件处理程序中,您可以创建一个新的视图模型对象并在其上调用changeData()。但是,这不是视图正在使用的视图模型对象,也没有做任何事情使其成为视图正在使用的视图模型对象。

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

Private Sub btnTest_Click(sender As Object, e As RoutedEventArgs) Handles btnTest.Click
    Dim view As Button = CType(sender, Button)
    Dim test As TestPageViewModel = CType(view.DataContext, TestPageViewModel)
    test.changeData()
End Sub

以上假设发送Button事件的Click继承了MainWindow的数据上下文。