Привязка к источнику данных из двух разных представлений. MVVM, WPF - PullRequest
0 голосов
/ 30 августа 2018

Итак, вот настройки. У меня есть два разных представления WPF. StandardEngineeredView и StandardEngineeredPrintView. У меня есть ObservableCollection под названием ModelRevisionList в моем StandardEngineeredViewModel.

Я пытаюсь привязать источник данных ModelRevisionList к двум различным представлениям. У меня есть контекст данных моих представлений, настроенный на ту же модель представления. В моем StandardEngineeredView есть кнопка, которая ведет меня к StandardEngineeredPrintView. Это второе представление, по сути, будет просто использоваться, чтобы позволить кому-то печатать данные. Примечание. У меня есть несколько других свойств, к которым я буду привязывать модель представления из обоих представлений. Я просто еще не пытался сделать это, потому что при попытке привязки к списку ревизий я получаю следующую ошибку:

System.Windows.Markup.XamlParseException HResult = 0x80131501 Сообщение = 'Добавить значение в коллекцию типа' System.Windows.Controls.ItemCollection ', вызвало исключение.' Номер строки «204» и позиция строки «55». Источник = PresentationFramework Трассировки стека: в System.Windows.Markup.WpfXamlLoader.Load (XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, логическое значение skipJournaledProperties, объект rootObject, параметры XamlObjectWriterSettings, Uri baseUri) в System.Windows.Markup.WpfXamlLoader.LoadBaml (XamlReader xamlReader, логическое skipJournaledProperties, объект rootObject, XamlAccessLevel accessLevel, Uri baseUri) в System.Windows.Markup.XamlReader.LoadBaml (Потоковый поток, ParserContext parserContext, родительский объект, логическое значение closeStream) в System.Windows.Application.LoadComponent (объектный компонент, Uri resourceLocator) в LabelPrinting.Views.EngineeringViews.StandardEngineeredPrintView.InitializeComponent () в C: \ Users \ eric_obermuller \ source \ repos \ LabelPrinting \ LabelPrinting \ Views \ EngineeringViews \ StandardEngineeredPrintView.xaml: строка 1

Внутреннее исключение 1: InvalidOperationException: операция недопустима во время использования ItemsSource. Вместо этого открывайте и изменяйте элементы с помощью ItemsControl.ItemsSource.

Соответствующая информация

  • Я использую MVVM Light.
  • Мой первый вид изначально привязан к наблюдаемой коллекции, и данные отображаются в виде просто отлично.
  • Оба представления используют один и тот же контекст данных.
  • Ошибка выдается, когда я получаю наблюдаемую коллекцию из модели представления.

StandardEngineeredViewModel Список редакций

private ObservableCollection<Revision> _ModelRevisionList = new ObservableCollection<Revision>();
public ObservableCollection<Revision> ModelRevisionList
{
    get { return _ModelRevisionList; } //Error thrown here upon get
    set { Set(ref _ModelRevisionList, value); }
}

Поле со списком StandarEngineeredView, которое связано

<ListBox
   BorderBrush="{StaticResource BackgroundBlueBrush}" 
   ItemsSource="{Binding ModelRevisionList}" 
   SelectedItem="{Binding SelectedRevision}"
   DisplayMemberPath="Date" 
   Margin="70 10" 
   MinHeight="150"
   MaxHeight="150"
   ItemStringFormat="{}{0:MM/dd/yyyy}"/>

StandardEngineeredPrintView Вид сетки, который связан

<Border Grid.Column="1" MaxHeight="250" MaxWidth="400" MinWidth="400">
    <DataGrid ItemsSource="{Binding ModelRevisionList}" AutoGenerateColumns="False">
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
        <DataGridTextColumn Header="Edited By" Binding="{Binding EditedBy}"/>
        <DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
    </DataGrid>
</Border>

Контекст данных, который устанавливается в обоих представлениях

DataContext="{Binding StandardEngineeredViewInstance, Source={StaticResource Locator}}"

Просмотр модели Locator

 public class ViewModelLocator
{
    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SetupNavigation();

        if (ViewModelBase.IsInDesignModeStatic)
        {
            // Create design time view services and models
            SimpleIoc.Default.Register<IDataAccessService, DataAccessService>();
        }
        else
        {
            // Create run time view services and models

            SimpleIoc.Default.Register<IDataAccessService, DataAccessService>();
        }
    }

    public StandardEngineeredViewModel StandardEngineeredViewInstance
    {
        get
        {
            SimpleIoc.Default.Register<StandardEngineeredViewModel>();
            return ServiceLocator.Current.GetInstance<StandardEngineeredViewModel>();
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
    private static void SetupNavigation()
    {
        SimpleIoc.Default.Unregister<IFrameNavigationService>();
        var navigationService = new FrameNavigationService();
        navigationService.Configure("StandardEngineeredPrintView", new Uri("/Views/EngineeringViews/StandardEngineeredPrintView.xaml", UriKind.Relative));
        SimpleIoc.Default.Register<IFrameNavigationService>(() => navigationService);
    }
}

Теперь, из-за ошибки, я думаю, что это как-то связано с тем, что я использую наблюдаемую коллекцию в моем StandardEngineeredView перед переходом к StandardEngineeredPrintView. Можете ли вы привязать два представления к одному источнику данных? Я делаю что-то неправильно, о чем я просто не знаю?

Я ценю любые предложения, и если вам нужна дополнительная информация / код, просто скажите об этом.

Спасибо!

1 Ответ

0 голосов
/ 30 августа 2018

Хорошо, решение было действительно простым. Я установил неверную сетку данных. Я должен был изменить это на это:

<DataGrid ItemsSource="{Binding ModelRevisionList}" AutoGenerateColumns="False">
     <DataGrid.Columns>
          <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
          <DataGridTextColumn Header="Edited By" Binding="{Binding EditedBy}"/>
          <DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
     </DataGrid.Columns>
</DataGrid>

Забыл DataGrid.Columns

...