2017-05-29 29 views
-1

我有多个viewmodels。我使用了三个数据模板,用于三个列表框,这三个列表框用3个comboxes及其选定的项目绑定。但我的问题是,只有一个数据上下文完美地工作。即,如果 我写像如何在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是可见的。或者,如果我只写一个DataContext,那么只有那一个出现在我的屏幕上。我已经尝试了不同的解决方案,但没有用。请帮助。

回答

2

在WPF中,每个UIElement总是只有一个DataContext属性。所以如果你多次分配这个属性,那么它将覆盖旧的值。

针对您的问题的解决方案您可以采用一个组合视图模型类,它具有全部三个子视图模型。然后你可以分配这个属性单独的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

什么是问题,你可以指定 –

相关问题