gpt4 book ai didi

c# - 从两个不同的 View 绑定(bind)到数据源。 MVVM、WPF

转载 作者:行者123 更新时间:2023-12-03 10:42:26 25 4
gpt4 key购买 nike

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

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

System.Windows.Markup.XamlParseException HResult=0x80131501 Message='Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception.' Line number '204' and line position '55'. Source=PresentationFramework StackTrace: at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) at LabelPrinting.Views.EngineeringViews.StandardEngineeredPrintView.InitializeComponent() in C:\Users\eric_obermuller\source\repos\LabelPrinting\LabelPrinting\Views\EngineeringViews\StandardEngineeredPrintView.xaml:line 1

Inner Exception 1: InvalidOperationException: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.



相关信息
  • 我正在使用 MVVM Light。
  • 我的第一个 View 最初绑定(bind)到可观察集合,并且数据在 View 中显示得很好。
  • 两个 View 使用相同的数据上下文。
  • 当我从 View 模型中获取可观察集合时,会引发错误。

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

    绑定(bind)的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 绑定(bind)的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>

    在两个 View 中设置的数据上下文
    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 中使用可观察集合的事实有关。您能否将两个 View 绑定(bind)到同一个数据源?我做错了什么我只是不知道吗?

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

    谢谢!

    最佳答案

    好的,解决方案非常简单。我的数据网格设置不正确。我不得不将其更改为:

    <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

    关于c# - 从两个不同的 View 绑定(bind)到数据源。 MVVM、WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52101882/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com