.net Can';不要把我的头缠在wpf数据绑定上

.net Can';不要把我的头缠在wpf数据绑定上,.net,wpf,data-binding,observablecollection,.net,Wpf,Data Binding,Observablecollection,我的设想: wpf表单有一个文本框和一个wpf toolkig。 在文本框中输入文本时,“我的服务”将返回一个IEnumerable项。我希望datagrid显示此服务的结果 我试着在谷歌上搜索,但我找不到答案。我才刚刚开始学习WPF,大多数使用的术语我都不知道。 我的想法是,我应该把我的服务结果放在一个明显的集合中,没有汗水。 但是我想以某种方式将它绑定到我的数据网格。我该怎么做?网格如何知道要生成哪些列?将网格的数据源(甚至数据上下文)设置为可观察的集合 我不熟悉该数据网格,但大多数网格都有

我的设想: wpf表单有一个文本框和一个wpf toolkig。 在文本框中输入文本时,“我的服务”将返回一个
IEnumerable
项。我希望datagrid显示此服务的结果

我试着在谷歌上搜索,但我找不到答案。我才刚刚开始学习WPF,大多数使用的术语我都不知道。
我的想法是,我应该把我的服务结果放在一个明显的集合中,没有汗水。 但是我想以某种方式将它绑定到我的数据网格。我该怎么做?网格如何知道要生成哪些列?

将网格的数据源(甚至数据上下文)设置为可观察的集合

我不熟悉该数据网格,但大多数网格都有选项,可以将可观察集合中该类型的所有公共属性公开为列,也可以在XAML中显式设置列布局,列定义的属性之一是要用于列数据的对象的属性

e、 g.基础设施数据网格

                <igDP:Field Name="OrderSize" Label="Order Size">
                    <igDP:Field.Settings >
                        <igDP:FieldSettings CellWidth="75">
                            <igDP:FieldSettings.EditorStyle>
                                <Style TargetType="{x:Type Editors:ValueEditor}" >
                                    <Style.Setters>
                                        <Setter Property="Format" Value="#,##0"/>
                                    </Style.Setters>
                                </Style>
                            </igDP:FieldSettings.EditorStyle>
                        </igDP:FieldSettings>
                    </igDP:Field.Settings>
                </igDP:Field>

名称是在对象上设置要使用的属性的位置。

将网格的数据源(甚至DataContext)设置为可观察的集合

我不熟悉该数据网格,但大多数网格都有选项,可以将可观察集合中该类型的所有公共属性公开为列,也可以在XAML中显式设置列布局,列定义的属性之一是要用于列数据的对象的属性

e、 g.基础设施数据网格

                <igDP:Field Name="OrderSize" Label="Order Size">
                    <igDP:Field.Settings >
                        <igDP:FieldSettings CellWidth="75">
                            <igDP:FieldSettings.EditorStyle>
                                <Style TargetType="{x:Type Editors:ValueEditor}" >
                                    <Style.Setters>
                                        <Setter Property="Format" Value="#,##0"/>
                                    </Style.Setters>
                                </Style>
                            </igDP:FieldSettings.EditorStyle>
                        </igDP:FieldSettings>
                    </igDP:Field.Settings>
                </igDP:Field>


名称是在对象上设置要使用的属性的位置。

网格可以直接生成列,也可以指定所需的列类型。如果你看这个,它会解释的。这是针对VS2010的,但是VS2008的基本原理是相同的——尽管实现略有不同,因为它没有那么集成


至于如何绑定,请将保存项目的ObservableCollection分配给网格的ItemsSource属性。

网格可以直接构建列,也可以指定所需的列类型。如果你看这个,它会解释的。这是针对VS2010的,但是VS2008的基本原理是相同的——尽管实现略有不同,因为它没有那么集成

至于如何绑定,请将保存项目的ObservableCollection分配给网格的ItemsSource属性

我的想法是,我应该把我的服务结果放在一个明显的集合中,没有汗水。但是我想以某种方式将它绑定到我的数据网格。我该怎么做

最简单的方法是将DataGrid的ItemsSource属性设置为ObservableCollection

网格如何知道要生成哪些列

DataGrid反映该集合中的对象,并为其找到的每个公共属性创建一列。有关更多信息,请参阅

如果您直接设置ItemsSource属性,那么它实际上不是wpf绑定。以下是我在WPF中开始数据绑定时发现的三个有用链接




我的想法是,我应该把我的服务结果放在一个明显的集合中,没有汗水。但是我想以某种方式将它绑定到我的数据网格。我该怎么做

最简单的方法是将DataGrid的ItemsSource属性设置为ObservableCollection

网格如何知道要生成哪些列

DataGrid反映该集合中的对象,并为其找到的每个公共属性创建一列。有关更多信息,请参阅

如果您直接设置ItemsSource属性,那么它实际上不是wpf绑定。以下是我在WPF中开始数据绑定时发现的三个有用链接





虽然ObservableCollection可以用于此目的,但取决于它的使用方式,您不会从中获得任何好处。ObservableCollection的关键特性是它实现INotifyCollectionChanged。这个接口所做的是提供一个通知机制,告诉UI属性已经更改。由于ObservableCollection已经实现了这一点,如果您将DataGrid、ListBox、ItemsControl等的ItemSource属性绑定到这种类型的集合,则在添加/删除/替换/移动/重置项时,它将自动更新UI。因此,每次要使用新的IEnumerable结果集更新集合时,都必须首先清除集合,然后添加新结果

然而,在这种情况下,我建议使用另一种方法来替代ObservableCollection。它是使用一种叫做ObjectDataProvider的东西。使用此方法,我们可以完全避免代码隐藏,而且总体上更干净。所以我们在某处有我们的服务,在本例中是在my Window.xaml.cs中

public class TranslationService
{
    public IEnumerable<string> Translate(string s)
    {
        return s.ToCharArray().Select(c => c.ToString());
    }
}
现在,在Window.Resources(或UserControl,或其他任何地方)中,我们可以引用我们的服务。一旦我们将服务公开为资源,我们就可以创建一个ObjectDataProvider,它公开我们希望使用的Translate方法

<Window.Resources>
    <local:TranslationService x:Key="MyTranslationService" />
    <ObjectDataProvider x:Key="MyProvider"
                        ObjectInstance="{StaticResource MyTranslationService}"
                        MethodName="Translate">
        <ObjectDataProvider.MethodParameters>
            ""
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

""

ObjdDATA提供程序对我们的服务进行键入,用字符串PAR调用翻译方法

<StackPanel>
        <TextBox TextChanged="OnTextChanged"
            Text="{Binding Source={StaticResource MyProvider}, Path=MethodParameters[0], BindsDirectlyToSource=True, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />
        <ListBox ItemsSource="{Binding Source={StaticResource MyProvider}}" />
    </StackPanel>