Привязка ListBox ItemsSource к результатам вызова метода во время компиляции? - PullRequest
1 голос
/ 10 декабря 2010

Я новичок в привязке данных WPF.

У меня есть ListBox в форме, которую я хочу связать с результатами следующего вызова метода:

RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
    .OpenSubKey(@"SOFTWARE\Vendor\Product\Systems").GetSubKeyNames();

В данный момент я делаю это во время выполнения, назначая ListBox.ItemsSource = (method); в обработчике событий Window_Loaded (). Но это означает, что исходные данные для элемента управления неочевидны при просмотре конфигурации элемента управления в редакторе форм.

Есть ли способ настроить эту привязку в XAML, чтобы она была видна в редакторе форм, чтобы облегчить понимание поведения кода?

Большинство примеров в документации MSDN связывают элементы управления со статическими ресурсами, такими как встроенные ресурсы XAML. Я заметил, что существует класс ObjectDataProvider , который обеспечивает «[...] возможность привязки к результату метода». Однако я нахожу примеры в документации ObjectDataProvider довольно запутанным. Я был бы признателен за несколько советов о том, является ли это правильным способом сделать это связывание, и если да, то какой синтаксис использовать при объявлении ObjectDataProvider.

1 Ответ

3 голосов
/ 10 декабря 2010

Короче говоря, я не думаю, что вы можете использовать такое сложное утверждение прямо в вашем XAML. Как вы обнаружили, можно связать результат вызова метода объекта через ObjectDataProvider, но ваше выражение представляет собой цепочку вызовов методов, которые, я считаю, не могут использоваться для непосредственного использования ObjectDataProvider в XAML.

Вместо этого вам следует подумать о реализации отдельного шаблона представления, такого как Model-View-ViewModel , чтобы представить результат вашего выражения через свойство коллекции в ViewModel, которую вы затем связываете как DataContext вашего представления (Window).

Что-то вроде:

MainWindow.xaml

<Window x:Class="WpfApplication10.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ItemsControl ItemsSource="{Binding Items}"/>
    </Grid>
</Window>

MainWindow.cs

using System;
using System.Collections.Generic;
using System.Windows;
using Microsoft.Win32;

namespace WpfApplication10 {
    public class ViewModel {
        public IEnumerable<String> Items {
            get { return RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Vendor\Product\Systems").GetSubKeyNames(); }
        }
    }

    /// <summary>
    ///   Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            DataContext = new ViewModel();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...