C # WPF Сделать DataGrid TemplateColumn ComboBox редактируемым на основе его ItemsSource - PullRequest
0 голосов
/ 28 августа 2018

Как я могу сделать ComboBox редактируемым в зависимости от того, имеет ли элемент в столбце свойство ItemsSource, установленное в null при создании столбца?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вы можете добавить стиль к ComboBox с помощью DataTrigger, где вы проверите, является ли ItemsSource нулевым.

Вот очень простой пример:

<Window x:Class="Q52063400.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d"
      Title="MainWindow" Height="450" Width="800">
  <Grid>
      <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
          <DataGrid.Columns>
              <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
              <DataGridTextColumn Header="Surname" Binding="{Binding Surname}" />
              <DataGridTemplateColumn Header="City">
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <ComboBox ItemsSource="{Binding Cities}" 
                                    SelectedItem="{Binding SelectedCity, Mode=TwoWay}">
                              <ComboBox.Style>
                                  <Style TargetType="ComboBox">
                                      <Setter Property="IsEditable" Value="False"/>
                                      <Style.Triggers>
                                          <DataTrigger Binding="{Binding Cities}" Value="{x:Null}">
                                              <Setter Property="IsEditable" Value="True"/>
                                          </DataTrigger>
                                      </Style.Triggers>
                                  </Style>
                              </ComboBox.Style>
                          </ComboBox>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
          </DataGrid.Columns>
      </DataGrid>
  </Grid>
</Window>

Код-за:

public partial class MainWindow : Window
{
   public MainWindow()
   {
       InitializeComponent();

       DataContext = GetItems();
   }

   public List<Person> GetItems ()
   {
       return new List<Person>()
       {
           new Person {Name = "John", Surname = "Rocky", Cities = new List<string> { "New York City", "Washington D.C.", "Chicago" } },
           new Person {Name = "John", Surname = "Rocky"},
           new Person {Name = "John", Surname = "Rocky", Cities = new List<string> { "Baltimore", "San Francisco", "Boston" } }
       };
   }
}

public class Person
{
   public string Name { get; set; }
   public string Surname { get; set; }

   public IEnumerable<string> Cities { get; set; }
   public string SelectedCity { get; set; }
}

Пример с другим редактором, основанным на ItemsSource:

...
<DataGridTemplateColumn Header="City">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>                           
            <Grid>
                <TextBox Text="{Binding SelectedCity, Mode=TwoWay}">
                    <TextBox.Style>
                        <Style TargetType="TextBox">
                            <Setter Property="Visibility" Value="Collapsed"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Cities}" Value="{x:Null}">
                                    <Setter Property="Visibility" Value="Visible"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBox.Style>
                </TextBox>
                <ComboBox ItemsSource="{Binding Cities}" 
                      SelectedItem="{Binding SelectedCity, Mode=TwoWay}">
                    <ComboBox.Style>
                        <Style TargetType="ComboBox">
                            <Setter Property="Visibility" Value="Visible"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Cities}" Value="{x:Null}">
                                    <Setter Property="Visibility" Value="Collapsed"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ComboBox.Style>
                </ComboBox>
            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
0 голосов
/ 28 августа 2018

Просто отметьте источник элементов поля со списком при выбранном событии изменения индекса или при загрузке главного окна, а затем установите комбинированный список IsEditable="true" для этого выбранного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...