Динамическая кнопка в сетке данных WPF — CellTemplateSelector

#c# #wpf #datagrid #celltemplate

#c# #wpf #datagrid #celltemplate

Вопрос:

У меня есть сетка данных, в которой я хочу добавить кнопку к каждой строке. Эта кнопка должна иметь другую функцию в зависимости от условия. Сетка данных состоит из списка некоторых файлов, которые можно установить или, если они уже есть, удалить с помощью кнопки. Поэтому кнопка должна вызываться либо «Установить», либо «Удалить».

Я создал следующий xaml

 ...
<Grid.Resources>            
    <local:ButtonTemplateSelector x:Key="buttonTemplateSelector">
        <local:ButtonTemplateSelector.InstallButtonTemplate>
        <DataTemplate>
            <Button x:Name="btn_installSnippet" Click="btn_installSnippet_Click">Install</Button>
        </DataTemplate>
        </local:ButtonTemplateSelector.InstallButtonTemplate>
        <local:ButtonTemplateSelector.UninstallButtonTemplate>
        <DataTemplate>
            <Button x:Name="btn_uninstallSnippet" Click="btn_uninstallSnippet_Click">Uninstall</Button>
        </DataTemplate>
            </local:ButtonTemplateSelector.UninstallButtonTemplate>
    </local:ButtonTemplateSelector>
</Grid.Resources>
...
<DataGrid x:Name="dataGrid_newViews" ItemsSource="{Binding}" HorizontalAlignment="Left" Height="148" Margin="40,152,0,0" VerticalAlignment="Top" Width="685" AutoGenerateColumns="True" SelectedCellsChanged="Datagrid_SelectedCellsChanged" CanUserAddRows="false" Grid.ColumnSpan="2">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Button" CellTemplateSelector="{StaticResource buttonTemplateSelector}" />
    </DataGrid.Columns>
</DataGrid>
  

В моем основном коде я создал следующее:

 public class ButtonTemplateSelector : DataTemplateSelector
{
    public DataTemplate InstallButtonTemplate { get; set; }
    public DataTemplate UninstallButtonTemplate { get; set; }

    public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
    {
      return InstallButtonTemplate;
    }
}
  

Здесь я полностью застрял в том, как получить значение из строки (из привязки datagrid), чтобы записать условие, если InstallButtonTemplate или UninstallButtonTemplate должно быть возвращено.

Комментарии:

1. Вы должны посмотреть на item параметр, приведенный к типу, который привязан к строкам таблицы данных, и проверить его свойства

Ответ №1:

Вы в значительной степени выполнили всю работу, не хватает одной детали — привести ваш object item параметр к типу данных элемента в коллекции, к которой вы привязываетесь, вот так:

 public class ButtonTemplateSelector : DataTemplateSelector
{
    public DataTemplate InstallButtonTemplate { get; set; }
    public DataTemplate UninstallButtonTemplate { get; set; }

    public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
    {
      var myItem = (YourType)item;
      if (myItem.FilePresent == true){
         return UninstallButtonTemplate ;
      }
      return InstallButtonTemplate;
    }
}
  

Комментарии:

1. Спасибо, я понимаю, что вы имеете в виду, но, к сожалению, я пока не получаю никаких свойств элемента приведенного объекта. Я попробую…