gpt4 book ai didi

silverlight - 将 Gridview 中选择的项目的值传递给不同用户控件的 ViewModel

转载 作者:行者123 更新时间:2023-12-04 02:42:39 25 4
gpt4 key购买 nike

在研究了三天的解决方案后,我终于放弃了。现在我需要你的帮助来解决这个问题。

场景:

我在用户控件中有一个 GridView(比方说 WLMSLogs.xaml),我的 GridView ItemSource 绑定(bind)到 ViewModel (WMLSLogsViewModel.cs) 中的一个列表

假设列表有 4 个项目(事件 ID、名称、请求和响应)。请求和响应都是 XML 字符串。

GridView需要在不同的tab项下显示RowDetailsTemplate中的一些List项。所以我在各自的 TabItems 下显示请求和响应。

<GridView x:Name="WMLSLogGrid" ItemsSource="{Binding WMLSLogModelList}">
<GridView.Columns>
<GridViewDataColumn DataMemberBinding="{Binding ID}" Header="ID"/>
<GridViewDataColumn DataMemberBinding="{Binding UserName}" Header="UserName"/>
</GridView.Columns>
<GridView.RowDetailsTemplate>
<DataTemplate >
<TabControl>
<TabItem Header="Request Xml">
<TextBlock text="{Binding Request}"/>
</TabItem>
<TabItem Header="Response Xml">
<TextBlock text="{Binding Response}"/>
</TabItem>
<TabItem Header="EventLogs" Tag="{Binding .}">
<views:LogEvents />
</TabItem>
</TabControl>
</Grid>
</DataTemplate>
</GridView.RowDetailsTemplate>

WMLSLogModelList 是 WMLSLogsViewModel.cs 中的 Observable 集合

到目前为止,一切正常,Grid 正在按预期显示数据。

现在当用户展开任何行时,他可以看到两个带有请求和响应的 TabItem。这里我需要在 Request 和 Response 选项卡之外再添加一个 TabItem (LogEvents)。

此 LogEvents 选项卡将再显示一个 GridView(因此我在选项卡中添加了一个新 View <views:LogEvents />)。棘手的部分来了。

这个LogEvents GridView需要根据对应的Selecteditem获取数据(即 EventId ),并通过此 EventId到不同的 ViewModel (LogEventViewModel.cs) 并将数据动态绑定(bind)到内部 GridView。当我展开 RowDetails 部分或选择 Tab LogEvents 时,所有这些都必须发生。

这两个 Grid 的数据项之间没有任何关系,除了获取主 GridView 的 Selected EventId 并将其传递给不同的 ViewModel,然后传递给域服务以获取内部 GridView 数据。

到目前为止我做了什么

正如我提到的,我为 LogEvents 创建了一个新的 View UserControl,将它放在主 GridView 的行详细信息模板内的 new TabItem(EventLogs) 下。

LogEvent UserControl 包含一个绑定(bind)到 LogEventsViewModel 的 Grid View,以根据 Selected row EventId 获取 Collection。

如何将 Selected EventId 分配给新的 ViewModel 并动态获取数据?

一种方法:正如我向您展示的那样,我通过将 LogEvents 放在 TabItem 旁边来调用它。每当我展开任何行时,它都会初始化 LogEvents 页面,在此期间我尝试将 Datacontext 绑定(bind)到 LogEventsViewModel。但我无法动态获取 Selected 行 EventId。如果我明白了,那么我可以轻松地将它传递给 LogEventsViewModel 构造函数。

       var _viewModel = new LogEventsViewModel(EventId);
this.DataContext = _viewModel;
InitializeComponent();

其他方式:将选定的 EventId 直接从 xaml View 绑定(bind)传递给该页面初始化,然后传递给 LogEventsViewModel像这样的

<views:LogEvents  something="{Binding EventId}"/>

还有其他方法吗?

详情:

LogEvents.xaml

<UserControl.Resources>
<viewModel:LogEventsViewModel x:Key="ViewModel"/>
</UserControl.Resources>
<Grid DataContext="{Binding Source={StaticResource ViewModel}}">
<GridView x:Name="LogEventsGrid" ItemsSource="{Binding View}"
<GridView.Columns>
<telerik:GridViewToggleRowDetailsColumn />
<telerik:GridViewDataColumn DataMemberBinding="{Binding EventId}" Header="LogEventId"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Exception}" Header="Exception" />
</GridView.Columns>
</telerik:RadGridView>
</Grid>

LogEvents.xaml.cs

public int EventId
{
get { return (int)GetValue(EventIdProperty); }
set { SetValue(EventIdProperty, value); }
}
public static readonly DependencyProperty EventIdProperty =
DependencyProperty.Register("EventId", typeof(int), typeof(ApplicationLog),
new PropertyMetadata(0, new PropertyChangedCallback(OnEventIdChanged)));

private static void OnEventIdChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
int LogEventId1 = (int)e.NewValue;
// Need to assign propery in LogEventsViewModel
}

LogEventsViewModel.cs

WMLCDomainContext _Context = new WMLCDomainContext();
private QueryableDomainServiceCollectionView<LogEvents> view;
public int _eventid;

public ApplicationLogsViewModel()
{
EntityQuery<LogEvents> getLogEventsQuery = _Context.GetApplicationLogListQuery(EventId);
this.view = new QueryableDomainServiceCollectionView<ApplicationLog>(_Context, getLogEventsQuery );
}

public IEnumerable View
{get {return this.view;}}

public int EventId
{
get{return this._eventid;}
set{_eventid = value;}
}

最佳答案

我会在您的 LogEventsViewModel 上创建一个依赖属性,然后在您的 LogEvents View 上设置一个绑定(bind),如下所示:

<views:LogEvents EventId="{Binding EventId}" />

然后在 LogEvents.xaml.cs 中你可以创建你的依赖属性:

    private LogEvents_ViewModel _viewModel
{
get { return this.DataContext as LogEvents_ViewModel; }
}

public string EventId
{
get { return (string)GetValue(EventIdProperty); }
set { SetValue(EventIdProperty, value); }
}
public static readonly DependencyProperty EventIdProperty =
DependencyProperty.Register("EventId", typeof(string), typeof(LogEvents),
new PropertyMetadata(string.Empty, new PropertyChangedCallback(OnEventIdChanged)));

private static void OnEventIdChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((LogEvents)d).OnTrackerInstanceChanged(e);
}

protected virtual void OnEventIdChanged(DependencyPropertyChangedEventArgs e)
{
this._viewModel.EventId = e.NewValue;
}

关于silverlight - 将 Gridview 中选择的项目的值传递给不同用户控件的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9468881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com