我正在使用 MV-VM 模式做一个 WPF 应用程序(如果相关,我正在使用 galasoft),但是当我通过 tabcontrol 导航时遇到问题。
我正在运行中添加标签。所有的绑定似乎都很顺利:在选项卡内或选项卡的标题中。我已经将我的 tabcontrol 绑定到一个可观察的列表。通过一个界面,我将几种类型的视图模型添加到此列表中,并且绑定似乎是正确的。
我的 XAML 代码如下所示:
<Grid>
<Grid.Resources>
<DataTemplate x:Key="itemTemplate">
<TechnicalControls:ItemTab />
</DataTemplate>
</Grid.Resources>
<TabControl Grid.Row="1" x:Name="MainTab" Grid.Column="1"
ItemsSource="{Binding TabViewModels}"
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}"
ItemContainerStyleSelector="{StaticResource LastItemStyleSelector}"
ItemTemplate="{StaticResource itemTemplate}"
>
<TabControl.Resources>
<DataTemplate DataType="{x:Type VM:JobViewModel}" x:Shared="False" >
<FunctionnalControls:Job />
</DataTemplate>
<DataTemplate DataType="{x:Type VM:ExcelJobViewModel}" x:Shared="False">
<FunctionnalControls:ExcelJob />
</DataTemplate>
<DataTemplate DataType="{x:Type VM:MonitoringViewModel}" x:Shared="False">
<FunctionnalControls:Monitoring />
</DataTemplate>
<DataTemplate DataType="{x:Type VM:ErrorViewModel}" x:Shared="False">
<FunctionnalControls:Error />
</DataTemplate>
</TabControl.Resources>
</TabControl>
</Grid>
例如,如果我从 ExcelJob 转到另一个 ExcelJob 用户控件,新的用户控件未正确加载,但它发生了变化,然后它可以工作,例如,如果我通过监视,我可以将 ExcelJob 转到另一个 ExcelJob。
我已经看过这个,但它对我不起作用。
我也看过这个:它说我们不应该使用输入,因为你可以集中它们。我试图将用户控件上的 IsEnabled 属性设置为 false。当标签发生变化时,我做到了。它没有工作...
我能看到的唯一解决方案是通过另一个新的用户控件,每次更改选项卡时都没有其他用途,但这很丑陋,我很确定,微软考虑过这一点并想出了一个更好的解决方案。
如有必要,我可以放视图模型的代码。
编辑:澄清一下,当我单击具有相同控件的其他选项卡时,它不会向我显示新的用户控件,而是向我显示前一个。为了看到新的,我必须用另一个用户控件切换到另一个选项卡,然后回到我想看的那个。
我已经查看了调试,当我单击另一个选项卡时它没有调用视图模型
<UserControl x:Class="App.ExcelJob"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
DataContext="{Binding Main.ExcelJobVM, Source={StaticResource Locator }}">
<Grid >
<Label>Futur Excel Job</Label>
<TextBox Width="200" Height="60" Text="{Binding Header}"/>
</Grid>
</UserControl>
所以 Main 返回 Mainviewmodel 和 Main.ExcelJobVM 返回用户控件的好 viewmodel。返回的实例基于选定的索引。
我唯一需要的是通过加载好的视图模型来强制重绘用户控件或调用更新数据上下文的方法。我试过了,到目前为止我失败了。我不确定我在做什么,因为我想使用 tabcontrol 的事件 SelectionChanged 但它会在后面的代码中,我不知道它是否仍然尊重 MVVM 模式。