2015-06-09 17 views
1

Я создал DataGrid в WPF из DataTable с AutoGenerateColumns = true. В VM у меня есть свойство команды для добавления и удаления столбцов, которые управляют базовым DataTable.WPF DataGrid Удалить столбец

Когда я вызываю AddColumn из главного окна XAML через Command="{Binding AddColumn}", он работает так, как ожидалось, но когда я вызываю RemoveColumn из файла ресурсов с контекстным меню, он вызывает свойство команды (im способен выполнить код), но не выполняет обновите сетку.

<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" CommandParameter="{Binding}" /> 

теперь я обновил обе команды только установить DataTable в нуль, т.е. Dt = null и для AddColumn это работает, как ожидалось, и удалили сетки и столбцов, но для RemoveColumn он ничего не делает ... Я также не вижу ошибки в окне вывода в отношении привязки и при переходе через код, вызываемый свойством. Я также попытался установить столбец в невидимый, который также не работал.

UPDATE

Я называю DeleteColumn из следующего (упрощенный) кода в файле ресурсов.

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}"> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Content, ConverterParameter=*, Converter={StaticResource AfterDashConverter}, RelativeSource={RelativeSource self}}" Value="Green"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
         <Grid> 
          <Grid.ContextMenu> 
           <ContextMenu> 
            <MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" /> 
           </ContextMenu> 
          </Grid.ContextMenu> 
          <DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False"/> 
          <ItemsPresenter/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

команды очень просты, AddColumn работает как сво непосредственно в моем главном экране и DeleteColumn не как его в указанном файле ресурсов. Я правильно проверил команды.

AddColumn = new RelayCommand(_ => 
    { 
     Dt = null; 
    }, true); 

    DeleteColumn = new RelayCommand(column => 
    { 
     Dt = null; 
    }, true); 
+0

возможно дубликат [? есть ли способ, чтобы скрыть определенный столбец в DataGrid при AutoGenerateColumns = True] (http://stackoverflow.com/questions/4000132/is-there-a-way- to-hide-a-specific-column-in-a-datagrid-when-autogeneratecolumns) – stuartd

+0

выше при загрузке, мне нужно это от кнопки команда на разовой основе – InContext

+0

@InContext Это странно пытается использовать тот же поток и получать разные результаты. Можете ли вы опубликовать еще какой-нибудь код? Может быть, AddCommand из XAML или их реализации? –

ответ

0

основная проблема была мой ресурс создания нового ViewModel, чтобы он не вызывал/воздействуя экземпляр VM, что моя точка зрения зависит от. Чтобы исправить это, мне нужно, чтобы установить DataContext моего ContextMenu родительского контроля (который был сетки) следующим образом:

DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyType}}} 

Если вы просто вызываете следующие его будет создать новый экземпляр вашего ViewModel и использования, :

<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" /> 
Смежные вопросы