madhu kumar
madhu kumar

Reputation: 810

how to apply multiple datacontext in xaml?

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

Answers (1)

Mukesh Methaniya
Mukesh Methaniya

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

Related Questions