使用TabControl和MVVM时绑定丢失

dbostream

在MVVM方面,我仍然认为自己是初学者,并且TabControl中的绑定存在问题。我的应用程序允许用户创建国家和州,输入一些信息,然后将它们保存到数据库中。下面是对我的应用程序的结构的描述:

基本的ViewModel / View称为ApplicationViewModel / ApplicationView。ApplicationViewModel有一个名为Tabs的ObservableCollection,由一个AllNationsViewModel和一个AllStatesViewModel组成。此Tabs属性绑定到ApplicationView中的TabControl的ItemsSource。

AllNationsViewModel / AllNationsView用于显示用户输入的所有国家。它还允许用户创建新国家并选择一个特定国家进行仔细检查。AllStatesViewModel / AllStatesView的功能相同,但状态不同。

最后,我有一个针对特定国家的NationViewModel / NationsView。这里也有StateViewModel / StateView对一个状态做同样的事情。

对于一个国家,您现在只能输入名称,但是对于一个州,您可以输入名称及其所属的国家。使用组合框选择国家,在国家/地区选项卡中创建的所有国家都会显示出来。

我使用一个称为DataFacade的静态类作为数据存储的接口。使用此界面可以添加,删除和检索国家/州列表;当添加或删除某些东西时,它也会触发事件。

我遇到的问题是,当在AllStatesViewModel(CurrentStateViewModel属性)中选择了一个状态时,我转到“国家”选项卡,然后回到“状态”选项卡,当前选择的状态已失去其国家。其他所有州仍然可以强硬。

我将尝试在下面显示相关代码(我从某些方法中删除了不相关的代码):

州级:

class State
{
   public string Name { get; set; }

   public Nation Nation { get; set; }
}

ApplicationView中的TabControl:

<TabControl ItemsSource="{Binding Tabs}" Margin="6">
   <TabControl.ItemTemplate>
      <DataTemplate>
         <ContentPresenter Content="{Binding DisplayName}" />
      </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
      <DataTemplate>
         <ContentPresenter Content="{Binding }" />
      </DataTemplate>
   </TabControl.ContentTemplate>
</TabControl>

当用户创建国家时,将触发AllNationsViewModel的AddCommand:

private void Add(NationViewModel vm)
{
   DataFacade.AddNation(vm.Nation);
}

将国家/地区添加到数据存储区时,将通知AllStatesViewModel:

private void OnDataStoreNationsChanged(object sender, DataFacadeEventArgs e)
{
   Nations.Add(new NationViewModel(e.Context as Nation));
}

上面的Nations属性是NationViewModels的ObservableCollection。现在,StateView中的ComboBox使用此属性来填充其项目,以便在创建/编辑状态时可以选择一个国家:

<ComboBox Grid.Row="1" Grid.Column="1" SelectedValue="{Binding Nation}" SelectedValuePath="Nation" ItemsSource="{Binding DataContext.Nations, RelativeSource={RelativeSource AncestorType={x:Type local:AllStatesView}}}">
   <ComboBox.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Name}" />
      </DataTemplate>
   </ComboBox.ItemTemplate>
</ComboBox>

我认为问题与上面的绑定有关。因为如果我不绑定到AllStatesViewModel中的Nations属性,而是绑定到ApplicationViewModel中的临时属性,则一切正常。当我转到另一个选项卡时,是否可能是TabControl抛出了AllStatesView的问题,因此上述绑定将StateViewModel的Nation属性设置为null?调试时,我看到退出状态标签时得到的是空值。

不是像我这样的初学者的人如何解决这种情况?我发现我的临时解决方案相当难看。我不确定我应该如何处理数据存储访问,因为我发现的所有MVVM示例都不关注此部分。

编辑:根据要求添加了一些图片:

Atm我只有最简单的测试GUI设置:

在这里,您会看到AllNationsView,atm的NationView只是顶部的“名称” TextBlock和TextBox。

国家

这是AllStatesView,顶部是当前选定的状态(使用StateView显示)。现在,您会看到美国被选为蒙大拿州的国家,如果我转到“国家”选项卡,然后回到“州”选项卡,则蒙大拿州的国家现在为空。如果我选择佛罗里达州,它仍然将美国作为其国家。

状态

布拉德利·乌夫纳

WPF仅将活动选项卡的UI保留在内存中。更改选项卡时,UI被破坏,新选项卡的UI被创建并反弹。

有几种方法可以解决您遇到的问题。您可以使用存储库模式来存储和访问与视图模型分开的数据源。基本上,外部对象保存您的数据源,例如州和国家/地区列表。这样,当活动选项卡更改时,它们不会被破坏。

另一个选择是将数据源存储在您的计算机上ApplicationViewModel,并通过引用ApplicationViewModel每个单独选项卡的视图模型上的来访问它们您不必RelativeSource在其中的任何地方使用绑定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用TabControl和MVVM在WPF中进行正确的数据绑定

MVVM 从 TabControl 绑定到 Page.DataContext

Tabcontrol MVVM 光视图模型绑定

将视图模型的集合绑定到WPF MVVM TabControl

使用 TabControl (MVVM) 显示不同的 ViewModel

使用MVVM时,绑定不适用于ListBox

WPF:绑定更新时,绑定丢失

使用数据绑定和MVVM处理onClick事件

使用MVVM在AvalonDock中绑定浮动元素的大小和位置

使用父级SelectedItem和ICommand进行主细节TabControl绑定(1:n)

与python和pandas一起使用多处理时丢失/丢失的文件丢失

MVVM事件和ICommand绑定

Swift MVVM绑定(使用装箱)

当对SQL行使用UPDATE和SET时似乎丢失

创建路径时丢失数据绑定

在Xamarin和MVVM中绑定ObservableCollection Listview时不刷新特殊标签

使用MVVM删除与所选控件不同的TabControl选项卡

在R Shiny中使用DT和data.table丢失了闪亮绑定输入类

c#mvvm将视图绑定到带有标题的tabcontrol

SwiftUI 中的 MVVM 和适当的绑定

WPF 中的 DataGrid 数据绑定和 MVVM

使用TabControl时,SciChart CompositeAnnotation消失

如何使用WPF和MVVM将命令绑定到Window Loaded事件

如何使用MVVM绑定(相对或绝对)Image,MouseEnter和MouseLeave事件在UI中的每个按钮?

使用MVVM,Entity Framework和mysql将基本数据绑定到文本框

在视图模型和视图之间使用MVVM进行WPF数据上下文绑定

使用MVVM的DataTemplate ListBox绑定和触发器中的CheckBox

XAML 中使用 Lambda 表达式和 MVVM 模式的 OneWay/TwoWay 绑定

如何使用 Android 数据绑定库和 MVVM 开发应用程序?