ItemsSource ObjectDataProvider 数据绑定与更新

本文介绍了一个使用WPF实现的树形视图控件案例,该控件利用HierarchicalDataTemplate进行数据绑定展示层级结构,并通过ObjectDataProvider提供数据源。此外,还展示了如何实现文件系统目录的动态加载及树节点的展开与收缩。

<UserControl x:Class="Newauto.BSEditController.LeftTreeView"
    <DockPanel Name="dockPanel">
        <DockPanel.Resources>
                <ObjectDataProvider  x:Key="MyList" ObjectInstance="_this.DataContext"   />

            <HierarchicalDataTemplate DataType    = "{x:Type BSEditController:StationInfoMode}"
                                ItemsSource = "{Binding Path=AgentInfoModes}">
                <TextBlock Text="{Binding Path=Name}"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType    = "{x:Type BSEditController:AgentInfoMode}">  
                <TextBlock Text="{Binding Path=Name}"/>
            </HierarchicalDataTemplate>
        </DockPanel.Resources>
        <TreeView Name="treeViewMyList" SelectedItemChanged="TreeView_SelectedItemChanged">
            <TreeViewItem Name="treeviewItem"  ItemsSource="{Binding Source={StaticResource MyList}}" Header="HeaderShow"  />
        </TreeView>
            <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click_1" />
        </DockPanel>

 

后台更新

private void button1_Click_1(object sender, RoutedEventArgs e)
        {

            this.DataContext = new StationInfoModes();
            ObjectDataProvider provider = dockPanel.FindResource("MyList") as ObjectDataProvider;
         
            if (provider != null)
            {
                provider.ObjectInstance = new StationInfoModes();
            }  

        }




<UserControl.Resources>

    <ObjectDataProvider x:Key="dataProvider"

                       ObjectType="loc:FileSystemObjectViewModel"

                       MethodName="GetSystemDrives"/>

 

    <loc:IconConverter x:Key="iconConverter" />

 

</UserControl.Resources>

<TreeView VirtualizingStackPanel.IsVirtualizing="True"

         VirtualizingStackPanel.VirtualizationMode="Recycling"

         DataContext="{Binding Source={StaticResource dataProvider}}"

         ItemsSource="{Binding Children}">

 

    <TreeView.ItemTemplate>

        <HierarchicalDataTemplate DataType="loc:FileSystemObjectViewModel"

                                 ItemsSource="{Binding Children}">

 

            <StackPanel Orientation="Horizontal">

                <Image Source="{Binding Converter={StaticResource iconConverter}}" />

                <TextBlock Text="{Binding DisplayName}" />

            </StackPanel>

 

        </HierarchicalDataTemplate>

    </TreeView.ItemTemplate>

 

    <TreeView.ItemContainerStyle>

        <Style TargetType="TreeViewItem">

            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />

        </Style>

    </TreeView.ItemContainerStyle>

 

</TreeView>

<think>我们正在讨论的是WPF中DataGrid数据绑定的方法。根据用户引用的内容,可以总结出几种常见的绑定方式。下面将详细说明这些方法。 用户引用的内容主要展示了: 1. DataGrid绑定数据源的基本方法。 2. 如何定义列(包括普通文本列、下拉框列等)。 3. 如何在MVVM模式下绑定命令。 因此,回答将围绕以下几个方面展开: 1. DataGrid绑定数据源 2. 列的定义(自动生成列和手动定义列) 3. 事件处理(特别是MVVM模式下的命令绑定) 4. 特殊列的绑定(如ComboBox列、按钮列) 注意:用户引用的内容中提到了ObjectDataProvider的使用、RelativeSource绑定等,这些也会在回答中涉及。 回答结构如下: 一、DataGrid数据绑定基础 二、定义列(自动生成列手动定义列) 三、事件处理命令绑定(MVVM模式) 四、特殊列的处理(ComboBox列、按钮列) 五、数据更新(如ObservableCollection的使用) 下面开始详细说明。 </think>### WPF中DataGrid数据绑定方法详解 在WPF中实现DataGrid数据源的绑定主要有以下几种方法,这些方法都基于MVVM模式(模型-视图-视图模型): #### 一、基础数据绑定ItemsSource属性) ```xml <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="True"/> ``` 核心实现: 1. 在视图模型(ViewModel)中创建可观察集合: ```csharp public ObservableCollection<DataItem> Items { get; } = new(); ``` 2. 设置DataContext: ```csharp public MainWindow() { InitializeComponent(); DataContext = new MainViewModel(); // 包含Items集合的ViewModel } ``` 此方式会自动生成列,适合快速原型开发[^1]。 #### 二、自定义列绑定 手动定义列格式和绑定路径: ```xml <DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="用户名" Binding="{Binding UserName}" Width="120"/> <DataGridTextColumn Header="邮箱" Binding="{Binding Email}" Width="180"/> <DataGridCheckBoxColumn Header="激活" Binding="{Binding IsActive}"/> </DataGrid.Columns> </DataGrid> ``` **注意事项**: - `AutoGenerateColumns="False"` 禁用自动列生成 - 支持文本、复选框、下拉框等多种列类型[^2] #### 三、MVVM命令绑定 在DataGridTemplateColumn中绑定按钮命令: ```xml <DataGridTemplateColumn Header="操作"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="查看" Command="{Binding DataContext.ViewCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding Id}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> ``` **关键技术点**: 1. 使用`RelativeSource`绑定到父级DataGrid的DataContext 2. `CommandParameter`传递当前行的数据标识[^4] #### 四、下拉框数据绑定 绑定枚举值或自定义列表: ```xml <DataGridComboBoxColumn Header="状态" SelectedItemBinding="{Binding Status}" ItemsSource="{Binding Source={StaticResource statusOptions}}"/> ``` 后端资源定义: ```csharp // 在资源中定义数据源 <Window.Resources> <local:StatusOptions x:Key="statusOptions"/> </Window.Resources> ``` 支持静态资源或动态绑定[^2] #### 五、事件处理(MVVM模式) 通过交互触发器绑定事件: ```xml <DataGrid x:Name="dataGrid"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding SelectedItem, ElementName=dataGrid}"/> </i:EventTrigger> </i:Interaction.Triggers> </DataGrid> ``` **依赖项**: - 引用`System.Windows.Interactivity`程序集 - 适用于SelectionChanged、CellEditEnding等事件[^3] #### 六、完整数据绑定示例 ```csharp // ViewModel public class MainViewModel : INotifyPropertyChanged { public ObservableCollection<User> Users { get; } = new() { new User { Id=1, Name="张三", Email="zhang@example.com" }, new User { Id=2, Name="李四", Email="li@example.com" } }; public ICommand DeleteCommand => new RelayCommand(param => { if(param is User user) Users.Remove(user); }); } // XAML <DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="ID" Binding="{Binding Id}"/> <DataGridTextColumn Header="姓名" Binding="{Binding Name}"/> <DataGridTemplateColumn Header="操作"> <DataTemplate> <Button Content="删除" Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding}"/> </DataTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> ``` ### 最佳实践建议 1. **数据更新**:使用`ObservableCollection<T>`确保UI自动更新 2. **性能优化**:大数据集启用虚拟化`EnableRowVirtualization="True"` 3. **验证机制**:实现`IDataErrorInfo`接口进行数据验证 4. **样式定制**:通过CellStyle/RowStyle自定义外观 5. **双向绑定**:编辑时使用`Binding`的`UpdateSourceTrigger`属性 DataGrid的数据绑定是WPF数据展示的核心技术,正确使用可极大提升开发效率和用户体验[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值