【问题标题】:Exclude columns from a databound datagrid in WPF从 WPF 中的数据绑定数据网格中排除列
【发布时间】:2013-02-12 21:27:23
【问题描述】:

我有一个ObservableCollection<SolarSystemViewModel>,其中SolarSystemViewModel 派生自ViewModelBase。当我绑定到我的ObservableCollection 时,ViewModelBase 公开了出现在数据网格中的IsInDesignModeIsInDesignModeStatic。如何在默认情况下从数据网格中隐藏这些列,而不必使用 Blend 生成 XAML,然后手动禁用这些列?

谢谢。

示例:

【问题讨论】:

  • 假设您使用的是AutoGenerateColumns=True,则不能使用默认数据网格。您需要在视图中创建所需的特定列。
  • 可能是this helps
  • @MetroSmurf 我没有自动生成列,但我意识到我的问题非常愚蠢。谢谢
  • @forTruce - 这不是一个愚蠢的问题。已经有足够多的人准备对 SO 进行判断了,不要质疑自己。你不知道你不知道什么,这就是为什么我们有这样的论坛。不断提问,不断学习,忽略那些忘记自己曾经是初学者的人。

标签: c# wpf data-binding datagrid blend


【解决方案1】:

我也一直在寻找这个问题的答案。 这是一个很好的解决方案:

像这样绑定 DataGrid 的属性“OnAutoGeneratingColumn”(注意 XAML 不是 100% 完成):

<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn" />

在你的 CodeBehind 中:

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    PropertyDescriptor propertyDescriptor = (PropertyDescriptor)e.PropertyDescriptor;
    e.Column.Header = propertyDescriptor.DisplayName;
    if (propertyDescriptor.DisplayName == "IsInDesignMode")
    {
        e.Cancel = true;
    }
}

"e.Cancel = true;" 将阻止生成当前列。这样您就可以轻松地从 DataGrid 中排除列。

【讨论】:

    【解决方案2】:

    我想了想,这很简单。 MS 让我们保持良好状态,因为我们可以使用 Path 访问 ObservableCollection 的 T 值的属性。这将使用来自数据网格的结果更新可观察的集合。我使用绑定到保存按钮的 ICommand 将 prism 用于更新/插入端。我使用 SQLite 的查询支持以相同的方法插入和更新,这让生活变得轻松。为澄清起见,我正在使用 Unity 和 Prism 关注 MVVM。

    <DataGrid Name="_dgProtocolSource" HorizontalAlignment="Left" Margin="-161,-61,-162,-163" AutoGenerateColumns="False" VerticalAlignment="Top" Width="365" Height="224" SelectionMode="Single" ItemsSource="{Binding OCSource, Mode=TwoWay}" CanUserAddRows="True" CanUserDeleteRows="True" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="ColumnName1" Binding="{Binding Path=Property1}" />
                <DataGridTextColumn Header="ColumnName2" Binding="{Binding Path=Property2}"/>
                <DataGridTextColumn Header="ColumnName3" Binding="{Binding Path=Property3}"/>
            </DataGrid.Columns>
    

    【讨论】:

    • 我严重怀疑这是否是 OP 想要的。此外,您的答案与 Chintana Meegamarachchi 的答案几乎没有什么不同。
    【解决方案3】:

    请尝试手动定义列.. 类似的东西。

    <dg:DataGrid x:Name="myDataGrid" ItemsSource="{Binding Path = SolarSystemViewModels}" AutoGenerateColumns="False">
      <dg:DataGrid.Columns>
        <dg:DataGridTextColumn Binding="{Binding FactionKills}" Header="Faction Kills" />
        <dg:DataGridTextColumn Binding="{Binding Jumps}" Header="Jumps" />
        <dg:DataGridTextColumn Binding="{Binding PodKills}" Header="Pod Kills" />
        <dg:DataGridTextColumn Binding="{Binding ShipKills}" Header="Ship Kills" />
      </dg:DataGrid.Columns>
    </dg:DataGrid>
    

    你不必为此使用混合,只需使用 VS XAML 编辑器

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 2010-10-04
      • 2011-09-28
      • 2010-11-15
      • 1970-01-01
      • 2015-08-07
      • 2013-03-19
      相关资源
      最近更新 更多