Не срабатывает свойство 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>
Когда выбор стоит между "Исправлена/Не Исправлена" напрашивается использование 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);
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть четыре TextBox и один ComboBoxВ зависимости от выбранного элемента в ComboBox, нужно включить/выключить (Enabled) TextBox
Есть WCF-сервис, крутится на сервере на IISeОн должен логировать IP клиентов, подключившихся к нему