在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] 删除。
我来说两句