绑定到同一ViewModel的多个TabItem在第一次选择选项卡时不会更新

时间:2014-06-03 19:58:04

标签: wpf mvvm binding tabitem

我有一个带有3个标签的tabcontrol。每个tabitem包含一个不同的contentcontrol,所有这些都绑定到同一个ViewModel,并且所有3个contentcontrol中都有一些项绑定到同一个属性。

我的问题是,如果我在初始选项卡上更改了一个comboBox,该更改不会反映在其他选项卡上,它们仍然将其SelectedItem设置为默认值。这仅在我第一次切换到该选项卡时发生。在我选择一个标签后,一切都按预期工作;在一个选项卡上进行的更改将反映在另一个选项卡上。

我试图避免太多的代码隐藏,我已经搜索并尝试了所有关于延迟绑定的解决方案,或者在选择选项卡时更新绑定,但我没有运气。

这是我的TabControl:

<TabControl Grid.Row="1" Margin="0,10">
    <TabItem Header="Tab1" IsSelected="True">
        <ContentControl Content="{Binding}" ContentTemplate="{StaticResource Tab1}" />
    </TabItem>
    <TabItem Header="Tab2">
        <ContentControl Content="{Binding}" ContentTemplate="{StaticResource Tab2}" />
    </TabItem>
    <TabItem Header="Tab3">
        <ContentControl Content="{Binding}" ContentTemplate="{StaticResource Tab}" />
    </TabItem>
</TabControl>

这是ContentControls之一:

<DataTemplate x:Key="Tab3" DataType="{x:Type vm:MainViewModel}">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Label Grid.Column="0" Grid.Row="0" Content="Flow" Style="{StaticResource tabLabel}" />
    <TextBox Grid.Column="1" Grid.Row="0" Style="{StaticResource tabTextBox}" />
    <ComboBox Grid.Column="2" Grid.Row="0" Style="{StaticResource tabUnitComboBox}" ItemsSource="{Binding DataList1}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedData1}" />
    <ComboBox Grid.Column="0" Grid.Row="1" Style="{StaticResource tabComboBox}" ItemsSource="{Binding DataList2}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedData2}" />
    <TextBox Grid.Column="1" Grid.Row="1" Style="{StaticResource tabTextBox}" />
    <Label Grid.Column="2" Grid.Row="1" Content="m³/h" Style="{StaticResource tabUnitLabel}" Visibility="{Binding SelectedData2, Converter={StaticResource VisibilityConverter}}" />
    <ComboBox Grid.Column="0" Grid.Row="2" Style="{StaticResource tabComboBox}" ItemsSource="{Binding DataList3}" SelectedItem="{Binding SelectedData3}" />
    <TextBox Grid.Column="1" Grid.Row="2" Style="{StaticResource tabTextBox}" />
    <ComboBox Grid.Column="2" Grid.Row="2" Style="{StaticResource tabUnitComboBox}" ItemsSource="{Binding DataList4}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedData4}" />
    <Label Grid.Column="0" Grid.Row="3" Content="Temperature" Style="{StaticResource tabLabel}" />
    <TextBox Grid.Column="1" Grid.Row="3" Style="{StaticResource tabTextBox}" />
    <ComboBox Grid.Column="2" Grid.Row="3" Style="{StaticResource tabUnitComboBox}" ItemsSource="{Binding DataList5}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedData5}" />
</Grid>
</DataTemplate>

ViewModel非常标准,继承自ObservableObject并实现OnPropertyChanged。正如我所说,一旦选择了一个标签,一切都很完美,但我真的希望从一开始就让它运作起来。

任何建议都将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

如果您想将该评论用作并回答

您是否有机会开始分配支持字段 在初始加载时不触发INPC。