将ListBox ItemsSource绑定到编译时的方法调用结果?

时间:2010-12-10 02:33:00

标签: c# wpf binding

我是WPF数据绑定的新手。

我在表单上有一个ListBox,我想绑定到以下方法调用的结果:

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

目前我在运行时通过在Window_Loaded()事件处理程序中分配ListBox.ItemsSource = (method);来完成它。但这意味着在窗体编辑器中查看控件配置时,控件的源数据不明显。

有没有办法在XAML中配置这个绑定,以便它在表单编辑器中可见,以使代码的行为更容易理解?

MSDN文档中的大多数示例都将控件绑定到静态资源,例如内联XAML资源。我注意到有一个ObjectDataProvider类提供了“[...]绑定到方法结果的能力。”但是,我发现ObjectDataProvider文档中的示例相当混乱。我很欣赏一些关于这是否是正确的绑定方式的建议,如果是,那么在声明ObjectDataProvider时使用什么语法。

1 个答案:

答案 0 :(得分:3)

简而言之,我认为您不能直接在XAML中使用这样复杂的语句。正如您所发现的那样,可以通过ObjectDataProvider绑定到调用对象方法的结果,但是您的表达式是一个方法调用链,我认为它不能用于直接在XAML中源ObjectDataProvider。

您应该考虑实现一个单独的表示模式,例如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();
        }
    }
}