Как убрать пунктирную линию в ComboBoxItem?
Она появляеться при нажатии и наведении.
ComboBox Tables = new ComboBox { FocusVisualStyle = null, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(20, 10, 5, 0) };
Tables.ItemsSource = db.Query<string>("Select [Name] FROM TreeView WHERE Type = 'Table'").ToList();
TabContent.Children.Add(Tables);
Использую Dapper для доступа к базе данным.
Так же использую Material Design.
В WPF работать напрямую с контролами в C# - плохая практика, минусы данного подхода перечислять не буду, их очень много. Если кратко то сумма этих минусов даст вам в десятки раз больше работы, чем если вдумчиво подойти к вопросу, и использовать XAML и MVVM.
Если кратко, с привязкой данных, не распиливая код на классы (что в будущем рекомендуется сделать), то заведите свойство.
public sealed partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<string> _myItems;
public ObservableCollection<string> MyItems
{
get => _myItems;
set
{
_myItems = value;
OnPropertyChanged();
}
}
public MainWindow()
{
InitializeComponent();
DataContext = this; // вот это важно, оно указывает, где Binding должен брать данные, как вы уже поняли, оно может указывать куда угодно, следовательно и данные могут быть в отдельном классе, где захотите
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e) // в xaml окну добавьте Loaded="MainWindow_Loaded"
{
// ... ваш код, выполняемый при запуске приложения
var items = db.Query<string>("Select [Name] FROM TreeView WHERE Type = 'Table'");
MyItems = new ObservableCollection(items);
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Далее можете делать с коллекцией MyItems что угодно, работать с ней можно почти так же как с List<string>. А ComboBox будет сам обновляться, когда состав коллекции поменяется, либо она будет заменена на другую, в реальном времени.
Способ привязки данных везде одинаковый, например вы можете точно так же привязать ComboBox.SelectedItem к свойству типа string. В сеттере можно вызывать свой код, то есть вам в этом случае не понадобится обработчик события SelectionChanged. (если надо показать - покажу, напишите об этом в комментарии)
В XAML стиль фокусировки можно обnullить так, через Style:
<ComboBox ItemsSource="{Binding MyItems}">
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="Margin" Value="20,10,5,0"/>
</Style>
</ComboBox.Style>
<ComboBox.Resources>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</ComboBox.Resources>
</ComboBox>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей