vud*_*duy 8 data-binding wpf datagrid relativesource itemssource
我DataSet
有义务Window.DataContext
; 我还有一个DataGrid
:
<DataGrid ItemsSource={Binding Tables[Items]}>
<DataGrid.Columns>
<DataGridTextBoxColumn Header={Binding Path=DataContext.Tables[Names]/Test, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} />
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
基本上,我正在尝试将该列的Header绑定到DataTable"Names",列"Test",第一行.
但是,我无法做到对.请注意,我可以在DataGrid外部绑定它.Grid的ItemsSource更改了数据上下文,我不知道如何在外部引用原始DataContext.
似乎绑定成功了; 但问题是Window.DataContext中Tables [Names]的当前项(第一行)丢失了.
如果我使DataSet静态并通过{x:Static local:dataset}访问它,那么事情就可以了.但我不能使用静态数据集,因为会有多个实例(多用户).
有谁能指出我正确的方向?
小智 13
我很确定你可以通过使用RelativeSource
绑定来做你想做的事情.
<DataGrid ItemsSource="{Binding StringCollection}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding}" />
<DataGridTextColumn Binding="{
Binding RelativeSource={
RelativeSource FindAncestor,
AncestorType={x:Type Window}},
Path=DataContext.SomethingOutsideDataContext}" />
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
我在http://bitbucket.org/claus/wpf-bindingoutsidedatacontext上做了一个简单的例子.
它允许您绑定到父窗口,在我的情况下,它将viewmodel作为datacontext(上面有SomethingOutsideDataContext属性).
你应该知道,这只适用于WPF而不是Silverlight - "FindAncestor,AncestorType"的东西还没有在Silverlight中实现......我不确定是否还有其他方法,除了使用静态资源.
不知道这是否适合您的情况,但您可以尝试这样的操作: 1)为您的窗口指定一个名称属性,例如 Name=ZeWindow。2)DataGridTextBoxColumn
像这样绑定你的标题:
<DataGridTextBoxColumn Header="{Binding Path=DataContext.Tables[Names]/Text, ElementName=ZeWindow}"/>
Run Code Online (Sandbox Code Playgroud)
所以基本上,您不是绑定到 的DataContext
,而是绑定到 Name=ZeWindow的。DataGrid
DataContext
UIElement
PS:我对 WPF 还很陌生,所以这可能不适用于 Window,但我使用 UserControls 做了类似的事情