两个视图引用相同的视图模型

时间:2011-02-21 11:27:52

标签: c# mvvm

我正在使用两个引用相同视图模型的视图。我的两个视图都包含一个绑定到视图模型中的值的文本框。我的问题是,如果我在一个GUI中更改文本框的值,它不会反映在另一个GUI中。我该怎么做才能做到这一点?

这是我的视图模型

    public class ProductViewModel:INotifyPropertyChanged
    { 
        private int machineheight;

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        private void RaisePropertyChanged(string propertyName)
        {

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

        public int MachineHeight
        {
            get
            {
                return this.machineheight;
            }
            set
            {
                this.machineheight = value;
                RaisePropertyChanged("MachineHeight");
            }
        }

        public ProductViewModel()
        {
        }

        private ICommand mUpdater;
        public ICommand UpdateCommand
        {
            get
            {
                if (mUpdater == null)
                    mUpdater = new Updater();
                return mUpdater;
            }
            set
            {
                mUpdater = value;
            }
        }

        private class Updater : ICommand
        {
            #region ICommand Members
            public bool CanExecute(object parameter)
            {
                return true;
            }
            public event EventHandler CanExecuteChanged;
            public void Execute(object parameter)
            {
                SecondWindow w = new SecondWindow();
                w.Show();
            }
            #endregion
        }
    }
}

第二个窗口是另一个GUI。点击更新按钮后,第二个窗口打开。但是我在第一个UI中更改的值未在新窗口中更新。

我的Xaml与UI相似......

<Window x:Class="WPFDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:local="clr-namespace:WPFDemo"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <local:ProductViewModel/>
</Window.DataContext>


<Grid  Height="307" Width="480" Initialized="Grid_Initialized">
    <Button Content="Update" Height="32" HorizontalAlignment="Left" Margin="165,158,0,0" Name="button1" VerticalAlignment="Top" Width="114" Command="{Binding Path=UpdateCommand}"/>
    <TextBox Height="42" HorizontalAlignment="Left" Margin="125,82,0,0" Name="textBox1" VerticalAlignment="Top" Width="169"  Text= "{Binding Path= MachineHeight, Mode=TwoWay}" />
    </Grid>
</Window>

我实际上不知道是什么问题..谢谢

3 个答案:

答案 0 :(得分:5)

<Window.DataContext>
    <local:ProductViewModel/>
</Window.DataContext>

嗨,如果你把它放在2个视图中,那么每个视图都有自己的viewmodel。所以你永远不会看到任何变化。您必须将datacontext从第一个视图设置为第二个视图。对于您的ICommand实现,请查看一些mvvm框架以便于实现,例如RelayCommand,DelegateCommand。

对于您的实际实现,您可以将以下内容添加到xaml和ViewModel(CommandParameter),然后它可以正常工作。

<Button Content="Update" Height="32" HorizontalAlignment="Left" Margin="165,158,0,0" Name="button1" VerticalAlignment="Top" Width="114" Command="{Binding Path=UpdateCommand}"
            CommandParameter="{Binding .}"/>

public void Execute(object parameter)
        {
            SecondWindow w = new SecondWindow();
            w.DataContext = parameter;
            w.Show();
        }

答案 1 :(得分:2)

在这种情况下,有一百种问题可能出错,而且我对基于XAML的数据绑定的长期抱怨之一是,MS工具可以帮助您找出它们中的哪一项。如果您不熟悉数据绑定,情况尤其如此,但即使多年来一直这样做的人也可能花费讨厌的时间来追踪数据绑定问题。

要检查的一些事项:

(1)确认您的数据绑定是双向的 (2)查看调试输出窗口,查看是否有任何错误消息 (3)在数据绑定中设置一个IValueConverter,并在转换器中设置一个断点,以查看在何时何地传递的数据。
(4)确认ViewModel中的数据实际上正在更新 (5)确认ViewModel实现了INotifyPropertyChanged,并且PropertyChanged事件正在触发。
(6)在这里发布您的实际代码,以便人们可以查看它。

等等。

希望这有帮助。

答案 2 :(得分:1)

如果ViewModel实现INotifyPropertyChanged

,它必须有效