Показать ComboBox на редактировании строк в Datagrid, WPF - PullRequest
0 голосов
/ 24 октября 2010

У меня есть DataGrid с данными в моем настольном приложении WPF 4. Когда пользователь дважды щелкает строку DataGrid, он переключается в режим редактирования, где пользователь может изменять значения ячейки. Теперь я хочу, чтобы для определенной ячейки пользователь мог выбирать только значения из поля со списком, например, пол - мужской / женский, а не вводить что-то другое.

Как отобразить поле со списком в режиме редактирования DataGrid?

1 Ответ

1 голос
/ 24 октября 2010

Фактически, существует множество различных способов,

Связывание с перечислением

public enum ChoiseEnum
{
    Yes,
    No,
    Maybe
}

Сначала вам понадобится ObjectDataProvider

xmlns:sys="clr-namespace:System;assembly=mscorlib"

<ObjectDataProvider MethodName="GetValues"
                    ObjectType="{x:Type sys:Enum}"
                    x:Key="ChoiseEnumDataProvider">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="local:ChoiseEnum" />
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

Затем мы можем привязать DataGridComboBoxColumn к свойству с именем Choise, как это

<DataGrid Name="c_dataGrid"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Choise"
                                SelectedItemBinding="{Binding Choise}"
                                ItemsSource="{Binding Source={StaticResource ChoiseEnumDataProvider}}"/>
    </DataGrid.Columns>
</DataGrid>

Показывать только значения из статического списка в ComboBox

UPDATE
Добавлено больше деталей

namespace ComboBoxDataGrid
{
    public class TestClass
    {
        static TestClass()
        {
            ChoiseData = new List<string>();
            ChoiseData.Add("Yes");
            ChoiseData.Add("No");
            ChoiseData.Add("Maybe");
        }
        public static List<string> ChoiseData
        {
            get;
            set;
        }

        public TestClass()
        {
            SelectedChoise = string.Empty;
        }
        public TestClass(string selectedChoise)
        {
            SelectedChoise = selectedChoise;
        }
        public string SelectedChoise
        {
            get;
            set;
        }
    }
}

public partial class WinWorkers: Window
{
    public WinWorkers()
    {
        InitializeComponent();
        TestClasses = new ObservableCollection<TestClass>();
        TestClasses.Add(new TestClass("Yes1"));
        TestClasses.Add(new TestClass("No"));
        TestClasses.Add(new TestClass("Maybe"));
        c_dataGrid.ItemsSource = TestClasses;
    }

    public ObservableCollection<TestClass> TestClasses
    {
        get;
        set;
    }
}

<Window x:Class="ComboBoxDataGrid.WinWorkers"
        xmlns:local="clr-namespace:ComboBoxDataGrid"
        ...>
    <Window.Resources>
        <local:TestClass x:Key="TestClass" />
    </Window.Resources>
    <Grid>
        <DataGrid Name="c_dataGrid"
                  AutoGenerateColumns="False"
                  RowHeaderWidth="100">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Choise_StaticList"
                                        SelectedValueBinding="{Binding SelectedChoise}"
                                        ItemsSource="{Binding Source={StaticResource TestClass}, Path=ChoiseData}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...