【发布时间】: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