3

我有一个ObservableCollection<SolarSystemViewModel>whereSolarSystemViewModel来自ViewModelBase. 当我ViewModelBase绑定IsInDesignModeIsInDesignModeStatic我的ObservableCollection. 如何在默认情况下从数据网格中隐藏这些列,而不必使用 Blend 生成 XAML,然后手动禁用这些列?

谢谢。

例子: 在此处输入图像描述

4

3 回答 3

18

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

像这样绑定 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.取消=真;” 将阻止生成当前列。这就是您可以轻松地从 DataGrid 中排除列的方式。

于 2014-02-03T10:13:10.763 回答
4

一旦我想到它,这很简单。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>
于 2016-01-05T17:31:42.937 回答
0

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

<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 编辑器

于 2013-02-13T03:17:48.050 回答