在我的 SilverLight 应用程序中,我的 ViewModel 中有一个名为“vmProperty”的属性和一个名为“dgSource”的列表。
我将我的 dgSource 作为 ItemsSource 绑定到数据网格,此时每个数据网格行的数据上下文更改为 dgSource 中的每个项目。其中一列,比如复选框列,需要绑定到 vmProperty。但由于 ViewModel 不再是该行的数据上下文,我无法访问此属性。
我该如何解决这个问题?如果问题不清楚,请告诉我,我将发布示例。提前致谢。
在我的 SilverLight 应用程序中,我的 ViewModel 中有一个名为“vmProperty”的属性和一个名为“dgSource”的列表。
我将我的 dgSource 作为 ItemsSource 绑定到数据网格,此时每个数据网格行的数据上下文更改为 dgSource 中的每个项目。其中一列,比如复选框列,需要绑定到 vmProperty。但由于 ViewModel 不再是该行的数据上下文,我无法访问此属性。
我该如何解决这个问题?如果问题不清楚,请告诉我,我将发布示例。提前致谢。
尝试将您的 chechbox 列的选中属性设置为:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourViewClassName}}, Path=DataContext.vmProperty}
这意味着将找到类型为您的视图类型的父元素,然后将其 DataContext 的 vmProperty 作为值检索。
更新:
这是 WPF 的解决方案。
对于silverlight,我认为您可以尝试使用这样的构造:
{Binding Path=DataContext.vmProperty, ElementName=YourElement}
YourElement 的 DataContext 是您的视图模型的实例。例如,我认为它可以是一个网格。
<Grid x:Name="YourElement" DataContext={Binding}>
<!-- DataGrid here -->
</Grid>
假设您的 ViewModel 被分配为 LayoutRoot 的 DataContext 这应该可以工作:-
IsChecked="{Binding DataContext.vmProperty, ElementName=LayoutRoot}"
当然这不起作用,最终会复制模板,因此实际使用绑定的名称范围中不存在“LayoutRoot”。
由于这是 ViewModel,最简单的解决方案是更改模型。公开 dgSource 中可用对象的所需值或公开Parent导航回 ViewModel 的属性。