【问题标题】:XAML Element just to group child elements for common DataContext in C# app?XAML 元素只是为了在 C# 应用程序中为通用 DataContext 分组子元素?
【发布时间】:2014-02-02 00:40:32
【问题描述】:

我的 C# Metro 应用程序中有一个 StackPanel,它使用 MVVM Light,上面有几个子控件。我希望一些子控件使用视图的主 DataContext 集。但是有一些子控件我想指向不同的 DataContext。我不想添加另一个 StackPanel 或其他容器控件只是为了按 DataContext 对子控件进行分组,因为这会造成很大的混乱。我想要的是一些“无害”的 XAML 元素,它接受我可以用来以所需方式对控件进行分组的 DataContext 属性。例如,假设有一个名为 GroupByDataContext 的假设 XAML 元素,那么我的 XAML 代码将如下所示的 XAML 块中所示。在这个假设的示例中,我将有两个名为 ViewModel1ViewModel2 的视图模型,我将使用假设的 GroupByDataContext 元素对它们进行分组。

是否有用于此目的的 XAML 元素?还是有其他方法可以完成这项任务?

<StackPanel x:Name="stackTopRow" HorizontalAlignment="Left" Height="115" VerticalAlignment="Center" Width="1226" Grid.Column="1" Margin="10,15,0,10" Orientation="Horizontal">
    <GroupByDataContext DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName1}"
        <TextBlock x:Name="pageTitle" Text="{StaticResource AppName}" IsHitTestVisible="false" Style="{StaticResource PageHeaderTextStyle}" Margin="10,0,60,0" VerticalAlignment="Center"/>
        <TextBlock TextWrapping="Wrap" x:Name="userName" Text="You're not signed in." FontSize="36" RenderTransformOrigin="-4.832,0.596" VerticalAlignment="Center"/>
    </GroupByDataContext>
    <GroupByDataContext DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName2}"
        <TextBlock TextWrapping="Wrap" Text="Search" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="36" Margin="0,39,0,38" Width="121" RenderTransformOrigin="-4.832,0.596" Visibility="Collapsed" />
        <TextBox x:Name="txtQuery" TextWrapping="Wrap" Text="TextBox" Width="605" Margin="0,36,0,35" VerticalAlignment="Center" FontSize="24" HorizontalAlignment="Right" Visibility="Collapsed"/>
        <Controls:ImageButton x:Name="btnSearch" Content="ImageButton" Width="79" Margin="0,36,0,38" VerticalAlignment="Center" Height="41" NormalStateImageSource="Assets/StoreLogo.png" Visibility="Collapsed"/>
    </GroupByDataContext>
</StackPanel>

【问题讨论】:

  • 使用另一个StackPanel。否则创建一个UserControl,它又包含一个StackPanel
  • 所有元素都允许您指定控件的DataContext。对于您的示例, GroupByDataContext 类可能只是一个简单的 StackPanel

标签: c# xaml mvvm mvvm-light datacontext


【解决方案1】:

您可以使用普通的Grid 并在其上设置 DataContext。 Grid 隐式包含一个单元格,因此您无需指定列或行定义,也无需将子控件显式放置在任何网格单元格中。

请记住,您的 StackPanel 现在将在 Grid 上运行,因为它是直接子级而不是 TextBlocks。根据您的布局,这可能没有任何区别,但如果确实如此,那么您可能希望恢复使用 @HighCore 提到的子 StackPanel。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多