【问题标题】:Binding to a data source from two different views. MVVM, WPF从两个不同的视图绑定到数据源。 MVVM、WPF
【发布时间】:2019-02-05 16:26:46
【问题描述】:

所以这里是设置。我有两个不同的 WPF 视图。 StandardEngineeredView 和 StandardEngineeredPrintView。我的 StandardEngineeredViewModel 中有一个名为 ModelRevisionList 的 ObservableCollection。

我正在做的是尝试从两个不同的视图绑定到 ModelRevisionList 数据源。我将视图的数据上下文设置为相同的视图模型。我的 StandardEngineeredView 中有一个按钮可将我导航到 StandardEngineeredPrintView。第二个视图本质上只是用于允许某人打印数据。请注意,我将在两个视图的视图模型中绑定到其他几个属性。我只是还没有尝试这样做,因为在尝试绑定到修订列表时,我收到以下错误:

System.Windows.Markup.XamlParseException H结果=0x80131501 Message='向'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 资源定位器) 在 LabelPrinting.Views.EngineeringViews.StandardEngineeredPrintView.InitializeComponent() 在 C:\Users\eric_obermuller\source\repos\LabelPrinting\LabelPrinting\Views\EngineeringViews\StandardEngineeredPrintView.xaml:line 1

内部异常 1: InvalidOperationException:使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素。

相关信息

  • 我正在使用 MVVM Light。
  • 我的第一个视图最初绑定到可观察集合,并且数据在视图中显示得很好。
  • 两个视图使用相同的数据上下文。
  • 当我从视图模型中获取 observable 集合时抛出错误。

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 绑定的gridview

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

查看模型定位器

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

现在由于错误,我认为这与我在导航到 StandardEngineeredPrintView 之前在我的 StandardEngineeredView 中使用可观察集合这一事实有关。您能否将两个视图绑定到同一个数据源?我是不是在做一些我不知道的错误?

感谢您的任何建议,如果您想了解更多信息/代码,请说出来。

谢谢!

【问题讨论】:

    标签: c# wpf mvvm binding mvvm-light


    【解决方案1】:

    好的,解决方案非常简单。我的数据网格设置不正确。我不得不把它改成这样:

    <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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2011-10-07
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多