Распечатка и привязка к свойствам типа, а не коллекции типов - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть Listbox с именами свойств типа Color из MySettings объекта.Я хочу создать другой элемент управления (скажем, TextBox, тип не имеет значения), который привязывается к значению имени свойства в списке.

Я в растерянности относительно того, какдостичь этого.Как и сейчас, список - это просто список строк, очевидно, он не знает об объекте MySettings.

Одна из вещей, о которых я подумал, - это создание коллекции объектов нестандартного типа, которая каким-либо образом связывается с объектом MySettings, и установка этого значения как ItemsSource для ListBox.

Я знаю, что здесь пытаюсь заново изобрести колесо, поэтому буду признателен за любые указатели, которые помогут мне начать работу.

Кодовый код, 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 Ответ

0 голосов
/ 02 апреля 2019

Вы можете назначить ListSox's ItemsSource для набора пар имя / значение (здесь анонимный класс, но вполне может быть и обычным классом):

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 и TextBlock, который привязывается к свойству 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}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...