2017-05-29 15 views
-1

私は複数のビューモデルを持っています。 3つのコンボボックスとその選択されたアイテムにバインドされた3つのリストボックスに対して、3つのデータテンプレートを使用しました。しかし、私の問題は、1つのdatacontextだけが完全に動作することです。私はxamlに複数のdatacontextを適用するには?

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> 

のようなコードを書いた場合、すなわち、 のみ最後のDataContextが表示されます。または、1つのDataContextを1つだけ書き込むと、それが私の画面に表示されます。私はstackoverflowで別のソリューションを試みたが、使用していない。 plsヘルプ。

答えて

2

WPFでは、Every UIElementは常に1つだけのDataContextプロパティを持っています。したがって、このプロパティを複数回割り当てると、古い値が上書きされます。

あなたの問題の解決策は、3つすべてのSub-ViewModelを持つ1つの結合されたビューモデルクラスを取ることができます。その後、このプロパティに個別のUI要素を割り当てることができます。

例:

public class CombinedViewModel 
{ 
    public wbItemViewModel WebItemVM= new wbItemViewModel(); 
    public InnerFlangeViewModel InnerFlangVM= new InnerFlangeViewModel(); 
    public OuterFlangeViewModel OuterVM= new OuterFlangeViewModel();  
} 

public MainWindow() 
{   
    InitializeComponent(); 
    DataContext = new CombinedViewModel(); 
} 

今あなたがプロパティ名で、あなたのXAMLでそれを使用することができます。この他のすべてのサブビューモデル

+1

なぜdownvote?! –

+0

申し訳ありません。それはうまくいかなかった。 –

+0

何が問題なのかを –

関連する問題