2010-12-10 2 views
1

Я новичок в привязке данных WPF.Binding ListBox ItemsSource для вызова метода в момент компиляции?

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

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

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

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

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

ответ

3

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

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

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

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(); 
     } 
    } 
} 
+0

Спасибо Уэйн, я буду смотреть на это. – Hydrargyrum 2010-12-10 03:03:27

Смежные вопросы