Reputation: 810
I have multiple viewmodels. I used three datatemplates for three listboxes which are binded with 3 comboxes and their selected items. But my problem is, only one datacontext works perfectly. i.e., if i wrote code like
public MainWindow()
{
InitializeComponent();
DataContext = new wbItemViewModel();
DataContext = new IfItemViewModel();
}
<Window.Resources>
<DataTemplate x:Key="wbObjectsDataTemplate">
<Grid>
<ItemsControl Grid.ColumnSpan="4" Grid.RowSpan="4" Height="24" Width="642" >
<Grid HorizontalAlignment="Left" VerticalAlignment="Top" Width="697" Margin="10,0,0,0" Height="54" >
<Label Content="{Binding WBName_lbl}" Margin="0,3,0,5" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"/>
<ComboBox x:Name="wbselect" Margin="5,0,10,1" Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="0">
<ComboBoxItem x:Name="wbstraight" IsSelected="True" Content="straight"></ComboBoxItem>
<ComboBoxItem x:Name="wbtapered" Content="tapered"></ComboBoxItem>
</ComboBox>
<TextBox x:Name="wbDesc" Margin="18,0,20,1" Grid.Column="2" Grid.Row="0">
</TextBox>
<Label x:Name="wblengthvalue" Margin="247,0,54,5" FontSize="8" Grid.Row="1" Grid.Column="2"/>
</Grid>
</ItemsControl>
<!--</GroupBox>-->
</Grid>
</DataTemplate>
<DataTemplate x:Key="ifObjectsDataTemplate">
<Grid>
<ItemsControl Grid.ColumnSpan="4" Grid.RowSpan="4" Height="24" Width="642" >
<Grid HorizontalAlignment="Left" VerticalAlignment="Top" Width="697" Margin="10,0,0,0" Height="54" >
</Grid.RowDefinitions>
<Label Content="{Binding IFName_lbl}" Margin="0,3,0,5" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"/>
<ComboBox x:Name="ifselect" Margin="5,0,10,1" Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="0">
<ComboBoxItem x:Name="ifstraight" IsSelected="True" Content="straight"></ComboBoxItem>
<ComboBoxItem x:Name="iftapered" Content="tapered"></ComboBoxItem>
</ComboBox>
<TextBox x:Name="ifDesc" Margin="18,0,20,1" Grid.Column="2" Grid.Row="0">
</TextBox>
<Label x:Name="iflengthvalue" Margin="247,0,54,5" FontSize="8" Grid.Row="1" Grid.Column="2"/>
</Grid>
</ItemsControl>
</Grid>
</DataTemplate>
</Window.Resources>
<ComboBox x:Name="wbCombo" ItemsSource="{Binding wbComboBoxList}" SelectedItem="{Binding wbSelectedComboIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="20" Width="92" SelectedIndex="4" Canvas.Left="102" Canvas.Top="19"/>
<ComboBox x:Name="ifCombo" ItemsSource="{Binding ifComboBoxList}" SelectedItem="{Binding ifSelectedComboIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="20" Width="92" SelectedIndex="4"
Canvas.Left="302" Canvas.Top="19" />
<ListBox x:Name="wbListDataTemplate" ItemsSource="{Binding wbVisibleItems}"
ItemTemplate="{DynamicResource wbObjectsDataTemplate}"
Background="{x:Null}"
SelectedItem="{Binding wbSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True" Canvas.Top="51" Height="153" Width="655">
</ListBox>
<ListBox x:Name="ifListDataTemplate" ItemsSource="{Binding ifVisibleItems}"
ItemTemplate="{DynamicResource ifObjectsDataTemplate}"
Background="{x:Null}"
SelectedItem="{Binding ifSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True" Canvas.Top="203" Height="153" Width="655">
</ListBox>
</Window>
Only the last DataContext is visible. Or if I write only one single DataContext, only that one is appeared on my screen. I have tried different solutions in stackoverflow but no use. pls help.
Upvotes: 3
Views: 4480
Reputation: 772
In WPF, Every UIElement
have always only one DataContext
property. So if you assign this property multiple time then it will override old value.
Solution for the your problem is You can take one combined view model class which have all three Sub-ViewModel. then after you can assign this property individual UI element.
Example :
public class CombinedViewModel
{
public wbItemViewModel WebItemVM= new wbItemViewModel();
public InnerFlangeViewModel InnerFlangVM= new InnerFlangeViewModel();
public OuterFlangeViewModel OuterVM= new OuterFlangeViewModel();
}
public MainWindow()
{
InitializeComponent();
DataContext = new CombinedViewModel();
}
now this all other subview model you can use it in your xaml by property name
Upvotes: 6