Попытка выучить WPF. Борьба с настройкой привязки данных. В моем основном пользовательском интерфейсе у меня есть два комбинированных списка, связанных со свойствами класса экземпляра. Я хочу «повторно использовать» этот экземпляр класса в обработчиках событий.
Моя борьба заключается не в том, чтобы заставить код работать, а в основе передовых методов проектирования.
Мой класс (упрощенно)
public class SomeClass : INotifyPropertyChanged
{
public SomeClass() {}
public IList<string> Categories
{
get
{
return _categories;
}
set
{
_categories = value;
OnPropertyChanged(nameof(Categories));
}
}
public IList<string> Forms
{
get
{
return _forms;
}
set
{
_forms = value;
OnPropertyChanged(nameof(Forms));
}
}
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Моим первым инстинктом было объявить все привязки в xaml. Все в одном месте. Что-то вроде
<Window.Resources>
<local:SomeClass x:key="MyClass"/>
</Window.Resources>
Затем на панели инструментов:
<ToolBarPanel x:Name="myToolStripName" DataContext="{StaticResource MyClass}">
<ToolBarTray>
<ToolBar Height="25px">
<ComboBox x:Name="cboCategories"
ItemsSource="{Binding Path=Categories}"
SelectionChanged="CboCategories_SelectionChanged" />
<ComboBox x:Name="cboForms"
ItemsSource="{Binding Path=Forms}" />
</ToolBar>
</ToolBarTray>
</ToolBarPanel>
В коде MainWindow
есть обработчик событий
private void CboCategories_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
string categoryName = e.AddedItems[0].ToString();
if (!string.IsNullOrEmpty(categoryName))
{
[problem: MyClass/SomeClass].GetFormNames(categoryName);
}
}
У меня тут проблемы. Мне нужно вызвать метод в моем классе экземпляра, но я не думаю, что смогу получить его из обработчика событий. Могу я? Я мог бы просто обновить его, но я бы потерял привязку.
Так что этот подход не сработает. Я мог бы изменить свой SomeClass
на Singleton, но я читаю, что это считается анти-паттерном. Другим подходом было бы сделать его static
, но тогда я не смогу (легко) реализовать INotifyPropertyChanged
.
В конце концов, я сделал SomeClass
a private readonly
поле MainWindow.xaml.cs
и установил DataContext
оттуда. Это прекрасно работает, но теперь приложение полагается на привязки, определяемые как в xaml, так и в программном коде, что кажется нелогичным. Конечно, я мог бы перенести все вещи, связанные с данными, в кодовый пакет. Опять нелогично.
Учитывая описанную настройку, которая, на мой взгляд, должна быть довольно распространенной, не могли бы вы дать мне несколько советов о том, что считается наилучшей практикой, и предложениях по улучшению?