【问题标题】:Using a View as a Data Template使用视图作为数据模板
【发布时间】:2010-10-19 10:08:23
【问题描述】:

我正在为我们的应用程序使用 MVVM 结构。我已将视图作为数据模板添加到网格 (Developer Express DXGrid)。

<DataTemplate x:Key="cardTemplate">
     <ui:MediaEnquiryParticipantView x:Name="mediaEnquiryParticipantView"/>
</DataTemplate>

现在,我的问题是我希望 View(MediaEnquiryParticipantView) 代表表格的 1 行。

我该如何解决我的问题?


<dxg:GridControl Name="grdParticipants"
                     Grid.Row="0"
                     Height="Auto" Width="Auto"
                     MaxHeight="5000"
                     VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
                     AutoPopulateColumns="True"
                     DataSource="{Binding Path=MediaEnquiryParticipantList,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                     MouseDoubleClick="grdParticipants_MouseDoubleClick">
            <dxg:GridControl.Resources>
                <DataTemplate x:Key="headerTemplateFullName">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Data.caUser.UserName}" />
                    </StackPanel>
                </DataTemplate>
                <DataTemplate x:Key="cardTemplate">
                    <ui:MediaEnquiryParticipantView x:Name="mediaEnquiryParticipantView" MediaEnquiryID="{Binding Path=Data.MediaEnquiryID}"/>
                </DataTemplate>
            </dxg:GridControl.Resources>
            <dxg:GridControl.Columns>
                <dxg:GridColumn FieldName="UserName" Width="150" AllowColumnFiltering="False"/>
                <dxg:GridColumn FieldName="CanResolve" Width="150" AllowColumnFiltering="False"/>
            </dxg:GridControl.Columns>
            <dxg:GridControl.View>
                <dxg:CardView x:Name="cardView"                                  
                              CardHeaderTemplate="{DynamicResource headerTemplateFullName}"
                              CardTemplate="{DynamicResource cardTemplate}">
                    <dxg:CardView.RowCellMenuCustomizations>
                        <dxb:BarButtonItemLink BarItemName="btnDelete" />
                    </dxg:CardView.RowCellMenuCustomizations>
                </dxg:CardView>
            </dxg:GridControl.View>
        </dxg:GridControl>

上面的网格以卡片视图形式显示“MediaEnquiryParticipantView”。 “MediaEnquiryParticipantsView”部分的网格我对每个都有单独的视图模型。

我的 MediaEnquiryParticipantViewModel 代码:

public class MediaEnquiryParticipantViewModel : ViewModelBase
{
    #region Fields

    private IQueryable<caUser> userList;

    #endregion Fields

    #region Constructors

    public MediaEnquiryParticipantViewModel(SessionContext sessionContext, NavigationItem navigationItem, MediaEnquiryViewModel mediaEnquiryViewModel, Mediator mediator)
        : base(mediator)
    {
        SessionContext = sessionContext;
        NavigationItem = navigationItem;
    }

    #endregion Constructors

    #region Properties

    public IQueryable<caUser> UserList
    {
        get
        {
            if (userList == null)
            {
                userList = GetUserList();
            }
            return userList;
        }
        set
        {
            userList = value;
            OnPropertyChanged("UserList");
        }
    }

    #endregion Properties

    #region Methods

    private IQueryable<caUser> GetUserList()
    {
        IQueryable<caUser> list = (from u in ((Chase_Media_Pro_Entity_Model)this.NavigationItem.ObjectContext).caUser
                                   select u);

        return list;
    }

    #endregion Methods
}

userList 用于 MediaEnquiryParticipantView 中的组合框。

【问题讨论】:

  • “现在,我的问题是我希望 View(MediaEnquiryParticipantView) 代表表格的 1 行。”您的视图模型中的表对象是什么以及它如何绑定到 ui?
  • 我正在使用实体框架,所以它是一个对象列表:private IQueryable mediaEnquiryParticipantList
  • 绑定在网格中:DataSource="{Binding Path=MediaEnquiryParticipantList,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

标签: c# wpf mvvm


【解决方案1】:

如果您为该行指定 DataType,它应该可以工作。

<DataTemplate DataType="{x:Type YourRowObjectTypeGoesHere}">
    <ui:MediaEnquiryParticipantView />
</DataTemplate>

使用该 DataTemplate,所有行对象都将显示为 MediaEnquiryParticipantView。

编辑:

<ListBox ItemSource={Binding YourViewModelListTable}>

</ListBox>

如果您的 YourViewModelListTable 仅包含您的模板行。它们将在列表框中显示为每行的 ui:MediaEnquiryParticipantView。

【讨论】:

  • 您好,感谢您的回复。我的数据模板有问题。我先有个问题:grid在生成数据模板的时候,是不是每次都会为每个数据模板创建一个新的对象呢?其次,我还需要在视图中填充组合框。现在我的问题是我需要在视图模型中进行。我需要知道如何解决这个问题,因为我需要以某种方式创建视图模型。
  • 将主键 (MediaEnquiryParticipantID) 绑定到 MediaEnquiryParticipantView 中的依赖属性并从那里创建我的视图模型并填充控件不是更好的选择吗?为什么我要问的是我已经尝试过数据类型,但没有运气......
  • 如果您使用 datatemplate 为您的视图模型创建视图,那么每次创建新视图时都是正确的。也许您应该发布数据网格和视图模型的代码。我发布了一些应该可以正常工作的示例代码。
  • 只是为了澄清我的结构。我有一个主视图(MediaEnquiryView)。在这个视图中,我在 (MediaEnquiryParticipantsView) 上显示带有网格的视图,卡片模板由 (MediaEnquiryParticipantView)、组合框和一些其他控件组成。 MediaEnquiryParticipantsView 上的 MediaEnquiryParticipantView 的绑定方式应该是我仍然可以编辑卡片模板 (MediaEnquiryParticipantView) 中的值并更新 MediaEnquiryParticipantsView 中的相关数据。希望能引起轰动。 =)
猜你喜欢
  • 2011-02-20
  • 2021-01-09
  • 2018-01-29
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多