#wpf #data-binding
#wpf #привязка к данным
Вопрос:
У меня есть Listbox
с именами свойств типа Color из MySettings
объекта. Я хочу создать другой элемент управления (скажем, a TextBox
, тип не имеет значения), который привязывается к значению указанного имени свойства.
Я в недоумении относительно того, как этого добиться. Как и сейчас, listbox — это просто список строк, очевидно, что он не знает об MySettings
объекте.
Одна из вещей, о которых я думал, — это создать коллекцию объектов пользовательского типа, которая каким-то образом привязывается к MySettings
объекту, и установить это как ItemsSource
для ListBox
.
Я знаю, что пытаюсь изобрести колесо здесь, поэтому я был бы признателен за любые указания, которые помогут мне начать.
Code-behind, ListBox
в настоящее время определен в xaml без каких-либо свойств, кроме x:Name="listBox"
foreach (var prop in settings.GetType().GetProperties()
.Where(p => p.PropertyType == typeof(System.Drawing.Color))
.OrderBy(p => p.Name))
{
listBox.Items.Add(new ListBoxItem()
{
Content = prop.Name,
});
}
MySettings содержит несколько свойств:
[UserScopedSetting()]
[ConfigurationProperty(nameof(BackColor), DefaultValue = "GhostWhite")]
public System.Drawing.Color BackColor
{
get { return (System.Drawing.Color)base[nameof(BackColor)]; }
set
{
base[nameof(BackColor)] = value;
OnPropertyChanged();
}
}
[UserScopedSetting()]
[ConfigurationProperty(nameof(ForeColor), DefaultValue = "Black")]
public System.Drawing.Color ForeColor
{
get { return (System.Drawing.Color)base[nameof(ForeColor)]; }
set
{
base[nameof(ForeColor)] = value;
OnPropertyChanged();
}
}
Комментарии:
1. Вы хотите привязать только к значению выбранного цвета или для каждого элемента должно быть текстовое поле? Кроме того, рассмотрите возможность использования
System.Windows.Media.Color
в качестве типа ваших настроек.System.Drawing.Color
это WinForms.2. Одно текстовое поле. Тип цвета должен быть передан элементу управления WinFormsHost, следовательно, для рисования.
Ответ №1:
Вы могли бы назначить ItemsSource из ListBox для набора пар имя / значение (здесь анонимный класс, но также может быть обычным классом):
listBox.ItemsSource = settings.Properties
.OfType<SettingsProperty>()
.Where(p => p.PropertyType == typeof(System.Drawing.Color))
.Select(p => new
{
Name = p.Name,
Value = settings[p.Name]
});
Затем объявите элемент ListBox ItemTemplate, который показывает свойство Name, и текстовый блок, который привязывается к свойству Value выбранного элемента ListBox:
<ListBox x:Name="listBox">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock Text="{Binding ElementName=listBox, Path=SelectedItem.Value}"/>
Комментарии:
1. Ваш первый пример кода у меня не сработал (он возвращает пустой список), но он помог направить меня на правильный путь: преобразовать соответствующие свойства в коллекцию объектов для использования в качестве ItemsSource для моего ListBox. Спасибо!
2. Я протестировал его с помощью нескольких настроек приложения типа System. Рисование. Цвет.