Как убрать пунктирную линию в 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>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Доброго времени суток программисты! В данный момент я пишу программу которая проверяет запущен-ли процесс Programm*****exe (Вместо звёздочек много...
Начал изучать объектно-ориентированное программированиеСо всеми принципами разобрался, но не могу до конца осмыслить, для чего нужна инкапсуляция
При запуске программы на моём пк всё нормально, но если запускать на другом, то выводит следующую ошибку