WPF如何从同一个viewmodel访问其他变量?

时间:2014-02-14 09:05:07

标签: c# wpf data-binding telerik relativesource

要显示Telerik:RadGridView上的项目,我通常会使用DataContext="{Binding [someViewModel]}"ItemSource="{Binding objectList, Mode=TwoWay}"

对于我的专栏,我将访问objectfield。整体情况如下:

<telerik:RadGridView DataContext="{Binding [someViewModel]}" 
     ItemSource="{Binding objectList, Mode=TwoWay}">

    <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsEnabled="{Binding enabledVar}" 
                            IsChecked="{Binding isChecked, Mode=Twoway}"
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>

            </telerik:GridViewDataColumn>  
    </telerik:RadGridView.Columns>

</telerik:RadGridView>

想象一下objectList中会有10个项目。 objectList中的每个项目都有一个变量isChecked,可以操作复选框IsChecked属性。

我在名为enabledVar的同一个视图模型中有另一个变量来控制十个复选框IsEnabled属性。 enabledVar不是objectList的一部分,但我无法获得价值。我可以知道如何处理这种情况吗?

更新

我找到了一些新的方向,但不确定它是否有帮助。

<CheckBox IsEnabled="{Binding enabledVar,
     RelativeSource={RelativeSource Mode=FindAncestor, 
     AncestorType=telerik:RadGridView}}"

但当然,仍然失败了。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果使用Ancestor,则必须绑定到DataContext

<CheckBox IsEnabled="{Binding Path=DataContext.enabledVar,
     RelativeSource={RelativeSource Mode=FindAncestor, 
     AncestorType=telerik:RadGridView}}"

另一种方法可能是使用元素绑定集名称

<telerik:RadGridView x:Name="myGrid" ...

然后在celltemplate中绑定它

<CheckBox IsEnabled="{Binding Path=DataContext.enabledVar, ElementName=myGrid}"

希望这有帮助。

答案 1 :(得分:0)

Update中建议的代码不起作用,因为GridViewDataColumn不是Visual树的一部分,因此无法访问DataContext。

您必须使用代理数据绑定,例如建议的here。您可以通过搜索“wpf proxy databinding”获得更多示例。