установка ComboBoxItem в качестве SelectedItem у ComboBox

488
13 января 2017, 07:20

Не срабатывает свойство IsSelected у ComboBoxItem. В чем причина?

С#:

       ComboBoxItem cbItemTrue = new ComboBoxItem();
        cbItemTrue.Content = "Исправлена";            
        cbItemTrue.Tag = true;
        ComboBoxItem cbItemFalse = new ComboBoxItem();
        cbItemFalse.Content = "Не исправлена";
        cbItemFalse.Tag = false;
        if (obj) cbItemTrue.IsSelected = true;
        else cbItemFalse.IsSelected = true;
        return new List<ComboBoxItem>() { cbItemTrue, cbItemFalse};

XAML

<ListView x:Name="listView" Height="145" Width="875" >
            <ListView.View>
                <GridView>                        
                    <GridViewColumn Header="Исправление" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox Width="150" ItemsSource="{Binding Corrected, Converter={StaticResource CorrectConverter}}" SelectedIndex="0"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
Answer 1

Когда выбор стоит между "Исправлена/Не Исправлена" напрашивается использование CheckBox, но если очень хочется...

Тестовый класс такой

public class TestClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsCorrected { get; set; }
    public override string ToString()
    {
        return $"{Id}-{Name}, Исправлено:{IsCorrected}";
    }
    public static List<TestClass> GetListTestClasses()
    {
        List<TestClass> result = new List<TestClass>();
        char sign = 'A';
        TestClass testClass = null;
        for (int i = 1; i < 11; i++, sign++)
        {
            testClass = new TestClass()
            {
                Id = i,
                Name = sign.ToString()
            };
            if (i % 2 == 0)
            {
                testClass.IsCorrected = true;
            }
            result.Add(testClass);
        }
        return result;
    }
}

Связь между MainWindow & MainViewModel

<Window.DataContext>
    <local:MainViewModel />
</Window.DataContext>

Связь между свойством-коллекцией, свойством-выбранный-элемент

<ListView ItemsSource="{Binding FirstList}" SelectedItem="{Binding SelectedElementFirstList}"

Пример одного из столбцов

<ListView.View>
            <GridView>
                <GridViewColumn Header="Id"
                                Width="30"
                                DisplayMemberBinding="{Binding Id}"/>

Пример (важно!) столбца с ComboBox (обратите внимание, что используется SelectedIndex для выбора элемента)

<GridViewColumn Header="Исправление"
                                Width="135">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox Width="120"
                                ItemsSource="{Binding DataContext.ListStatusIsCorrected, ElementName=window}"
                                SelectedIndex="{Binding IsCorrected, Converter={StaticResource Converter}}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

Для работы преобразования Boolean <-> Int32 используем такой конвертер

public class BooleanToIntConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool corrected = (bool)value;
        if (corrected)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int corrected = (int)value;
        if (corrected == 1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Конвертер выставлен для подключения как статический ресурс так

<Window.Resources>
    <local:BooleanToIntConverter x:Key="Converter"/>
</Window.Resources>

Целиком вью-модель выглядит так

public class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    //ctor
    public MainViewModel()
    {
        //заполняем коллекцию тестовыми данными
        FirstList = new ObservableCollection<TestClass>(TestClass.GetListTestClasses());
    }
    //для показа MessageBox
    public IMessageService MessageService { get; set; }
    /// <summary>
    /// ListView ItemsSource="{Binding FirstList}" 
    /// </summary>
    private ObservableCollection<TestClass> _FirstList;
    public ObservableCollection<TestClass> FirstList
    {
        get { return _FirstList; }
        set
        {
            _FirstList = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(FirstList)));
        }
    }
    /// <summary>
    /// ListView SelectedItem="{Binding SelectedElementFirstList}"
    /// </summary>
    private TestClass _SelectedElementFirstList;
    public TestClass SelectedElementFirstList
    {
        get { return _SelectedElementFirstList; }
        set
        {
            _SelectedElementFirstList = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(SelectedElementFirstList)));
        }
    }
    /// <summary>
    /// ComboBox ItemsSource="{Binding DataContext.ListStatusIsCorrected, ElementName=window}"
    /// </summary>
    public List<string> ListStatusIsCorrected { get; private set; }
        = new List<string>() { "Не исправлена", "Исправлена" };

    /// <summary>
    /// Кнопка отображения информации об элементе
    /// </summary>
    private RelayCommand _ShowInfoAboutTestClassCommand;
    public RelayCommand ShowInfoAboutTestClassCommand
    {
        get
        {
            return _ShowInfoAboutTestClassCommand = _ShowInfoAboutTestClassCommand ??
              new RelayCommand(OnShowInfoAboutClass);
        }
    }
    private void OnShowInfoAboutClass()
    {
        //если элемент не выбран в ListView
        if (SelectedElementFirstList == null) return;
        //показываем данные выделенного элемента
        string message = SelectedElementFirstList.ToString();
        MessageService.ShowInfo(message);
    }
}
READ ALSO
Почему не изменяется свойство контрола?

Почему не изменяется свойство контрола?

У меня есть четыре TextBox и один ComboBoxВ зависимости от выбранного элемента в ComboBox, нужно включить/выключить (Enabled) TextBox

366
Чат-Бот VK C#, парсинг страницы

Чат-Бот VK C#, парсинг страницы

Привет, задача такаяДобавляю бота в конференцию и пишу

621
WCF: получение IP клиента

WCF: получение IP клиента

Есть WCF-сервис, крутится на сервере на IISeОн должен логировать IP клиентов, подключившихся к нему

471