我是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时使用什么语法。
答案 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();
}
}
}