Два представления, относящиеся к одной модели представления - PullRequest
3 голосов
/ 21 февраля 2011

Я использую два вида, которые ссылаются на одну и ту же модель. Оба моих представления содержат текстовое поле, которое привязывается к значению в модели представления. Моя проблема в том, что если я изменю значение текстового поля в одном графическом интерфейсе, оно не будет отражено в другом. Что я должен сделать, чтобы достичь этого?

Это моя модель взгляда

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

Второе окно - другой графический интерфейс. Как только я нажимаю кнопку обновления, открывается второе окно. Но значение, которое я изменил в первом пользовательском интерфейсе, не обновляется в новом окне.

Мой Xaml одинаков для обоих интерфейсов ..

<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 ]

5 голосов
/ 22 февраля 2011
<Window.DataContext>
    <local:ProductViewModel/>
</Window.DataContext>

Привет, если вы добавите это в свои 2 представления, то у каждого будет своя собственная модель представления. так что вы никогда не увидите никаких изменений. Вы должны установить текстовый констант данных от первого просмотра до второго просмотра. Кстати, для вашей реализации 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();
        }
2 голосов
/ 22 февраля 2011

Есть сотни вещей, которые могут пойти не так в этом сценарии, и одна из моих давних проблем с привязкой данных на основе XAML заключается в том, что инструменты MS дают вам очень маленькую помощь в выяснении, какая из этих сотен вещей есть. Это особенно актуально, если вы новичок в привязке данных, но даже люди, которые занимаются этим годами, могут тратить отвратительные часы на отслеживание проблем привязки данных.

Что нужно проверить:

(1) Убедитесь, что ваши привязки данных двусторонние.
(2) Посмотрите в окне вывода отладочной информации, чтобы увидеть, есть ли там какие-либо сообщения об ошибках.
(3) Установите IValueConverter в привязке данных и установите точку останова в преобразователе, чтобы увидеть, какие данные передаются, где и когда.
(4) Убедитесь, что данные в ViewModel действительно обновляются.
(5) Убедитесь, что ViewModel реализует INotifyPropertyChanged и что событие PropertyChanged запускается.
(6) Опубликуйте свой фактический код здесь, чтобы люди могли посмотреть на него.

и т. Д.

Надеюсь, это поможет.

1 голос
/ 21 февраля 2011

Должно работать, если ViewModel реализует INotifyPropertyChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...