首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DataGrid行和MVVM

DataGrid行和MVVM
EN

Stack Overflow用户
提问于 2010-05-18 14:06:04
回答 3查看 1K关注 0票数 0

我有一个有很多行的wpf数据网格,每一行都有一些特定的行为,比如列1组合的选择更改将过滤列2组合,并且在行1中选择的列1组合不能在行2列1组合中选择,等等...

因此,我正在考虑为主数据网格创建一个视图模型,并为每一行创建另一个视图模型。

这是一个好的MVVM实现吗?这样我就可以有效地处理每一行的更改事件。

问题是,如何将“每行”创建为用户控件视图?在数据网格中。

我想实现这样的东西:

代码语言:javascript
运行
复制
        <TreeView
        Padding="0,4,12,0">

        <controls:CommandTreeViewItem
            Header="Sales Orders"
            Command="{Binding SelectViewModelCommand}"
            CommandParameter="Sales Orders"/>          

    </TreeView>  

我想要一个datagrid而不是TreeView,而不是controls:CommandTreeViewItem是WPF中的datagrid行。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-18 18:15:47

代码语言:javascript
运行
复制
        <my:DataGrid x:Name="locationGrid">
            <my:DataGrid.Columns>
                <my:DataGridTemplateColumn>
                    <my:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=LocationName}"/>
                        </DataTemplate>
                    </my:DataGridTemplateColumn.CellTemplate>
                    <my:DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                            <TextBox Text="{Binding Path=LocationName}"/>
                        </DataTemplate>
                    </my:DataGridTemplateColumn.CellEditingTemplate>
                </my:DataGridTemplateColumn>
            </my:DataGrid.Columns>
        </my:DataGrid>    

您几乎可以在每个DataGrid列中放置任何您想要的内容。我在这里给你举了个例子。您可以定义偶数表头模板。如果你做小程序是不需要MVVM的,但是我不太理解你为什么你需要MV的DataGridRow?创建UserControl并将其嵌入到DataTemplate中,对于UserControl则创建VM类。

票数 1
EN

Stack Overflow用户

发布于 2010-05-18 15:32:36

您可以为每一行使用DataTemplate,并根据需要对其进行自定义。

票数 0
EN

Stack Overflow用户

发布于 2011-10-25 08:30:24

只需在视图的viewModel上的公共属性中创建视图模型类的可观察集合。下面是一个例子

代码语言:javascript
运行
复制
public ObservableCollection<YourViewModelForEachRow> LineItems{ get; private set; }

然后,在您的视图中,datagrid xaml会将ItemsSource属性设置为您在上面创建的LineItems属性。

代码语言:javascript
运行
复制
ItemSource="{Binding LineItems"}

当然,这假设包含DataGrid的视图的DataContext已设置为创建LineItems的ViewModel。我这样做是为了我的观点。我仍然认为自己是WPF的新手,但这似乎是一种非常干净和灵活的MVVM方法。处理每一行上的数据输入、小部件处理等的所有逻辑都由行视图模型负责。

另外,您的xaml非常干净。我的典型列定义如下所示(其中LineItemNumber是我的LineItemViewModel上的公共属性):

代码语言:javascript
运行
复制
<DataGridTextColumn Binding="{Binding Path=LineItemNumber, StringFormat=000}"
                              ElementStyle="{StaticResource CellRightAlign}"
                              Header="Line No." />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2854868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档