2010-12-10 39 views
1

我是新来WPF数据绑定。在编译时绑定ListBox ItemsSource方法调用结果?

我有一个窗体上的列表框,我想绑定到下面的方法调用的结果:通过在Window_Loaded分配ListBox.ItemsSource = (method);

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

在我做它在运行时的那一刻()事件处理器。但是这意味着在查看表单编辑器中的控件配置时,控件的源数据并不明显。

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

MSDN文档中的大多数示例都将控件绑定到静态资源,如内联XAML资源。我注意到有一个ObjectDataProvider类提供了“绑定到方法结果的能力”。但是我在ObjectDataProvider文档中发现了很多令人困惑的例子。我很感激一些关于这是否是正确的方法来做这个绑定的建议,如果是的话,在声明ObjectDataProvider时使用什么语法。

回答

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

感谢鲁尼,我会考虑这样做。 – Hydrargyrum 2010-12-10 03:03:27