Перечисление и привязка к свойствам типа, а не к коллекции типов

#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. Рисование. Цвет.