- Add name attribute to the control tag:
- x:Name=”variantEditorColumn”
- Set the DataContext attribute of an element to apply the data to all of its children:
- DataContext=”{Binding Source={x:Reference variantEditorColumn}}”>
- Add (relative) bindings to the children:
- ItemsSource=”{Binding Path=LookupItems1}”
- Add absolute bindings to non-children
- ItemsSource=”{Binding Path=LookupItems1,Source={x:Reference variantEditorColumn}}”
<dxg:GridColumn x:Class="QuotationOrderHandling.Views.Controls.VariantEditorGridColumn" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:controls="clr-namespace:QuotationOrderHandling.Views.Controls" x:Name="variantEditorColumn" > <dxg:GridColumn.Resources> <controls:DebugDummyConverter x:Key="debugDummyConverter" /> </dxg:GridColumn.Resources> <dxg:GridColumn.CellDisplayTemplate> <DataTemplate> <Label Content="{Binding Path=Row,ConverterParameter={x:Reference variantEditorColumn},Converter={StaticResource debugDummyConverter}}"></Label> </DataTemplate> </dxg:GridColumn.CellDisplayTemplate> <dxg:GridColumn.CellEditTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <Label Content="{Binding Path=Row,ConverterParameter={x:Reference variantEditorColumn},Converter={StaticResource debugDummyConverter}}"></Label> <Popup Placement="Bottom" HorizontalAlignment="Left" VerticalAlignment="Top" Width="250" Height="120" IsOpen="True"> <Border BorderBrush="DarkGray" BorderThickness="1" Width="Auto" Height="Auto" HorizontalAlignment="Left" VerticalAlignment="Top" > <DockPanel Background="WhiteSmoke" Width="250" Height="200"> <StackPanel Orientation="Vertical" Margin="10" DataContext="{Binding Source={x:Reference variantEditorColumn}}"> <Label Content="{Binding Path=Variant1Name}"></Label> <dxg:LookUpEdit x:Name="lookupEdit1" ItemsSource="{Binding Path=LookupItems1}" ValueMember="KeyStr" DisplayMember="KeyName" AutoPopulateColumns="False" EditValue="{Binding Variant1, Mode=TwoWay}" EditValueChanged="lookupEdit1_EditValueChanged" PopupWidth="580"> <dxg:LookUpEdit.StyleSettings> <dxg:SearchLookUpEditStyleSettings AllowGrouping="False" /> </dxg:LookUpEdit.StyleSettings> <dxg:LookUpEdit.PopupContentTemplate> <ControlTemplate> <dxg:GridControl Name="PART_GridControl"> <dxg:GridControl.Columns> <dxg:GridColumn FieldName="KeyStr" Header="Sleutel" Width="150" /> <dxg:GridColumn FieldName="KeyName" Header="Omschrijving" Width="380" /> </dxg:GridControl.Columns> <dxg:GridControl.View> <dxg:TableView AutoWidth="False" SearchPanelHighlightResults="True" SearchDelay="50" x:Name="CurrentTableView"/> </dxg:GridControl.View> </dxg:GridControl> </ControlTemplate> </dxg:LookUpEdit.PopupContentTemplate> </dxg:LookUpEdit> <Label Content="{Binding Path=Variant2Name}"></Label> <dxg:LookUpEdit x:Name="lookupEdit2" ItemsSource="{Binding Path=LookupItems2}" ValueMember="KeyStr" DisplayMember="KeyName" AutoPopulateColumns="False" EditValue="{Binding Variant2, Mode=TwoWay}" EditValueChanged="lookupEdit2_EditValueChanged" PopupWidth="580"> <dxg:LookUpEdit.StyleSettings> <dxg:SearchLookUpEditStyleSettings AllowGrouping="False" /> </dxg:LookUpEdit.StyleSettings> <dxg:LookUpEdit.PopupContentTemplate> <ControlTemplate> <dxg:GridControl Name="PART_GridControl"> <dxg:GridControl.Columns> <dxg:GridColumn FieldName="KeyStr" Header="Sleutel" Width="150" /> <dxg:GridColumn FieldName="KeyName" Header="Omschrijving" Width="380" /> </dxg:GridControl.Columns> <dxg:GridControl.View> <dxg:TableView AutoWidth="False" SearchPanelHighlightResults="True" SearchDelay="50" x:Name="CurrentTableView"/> </dxg:GridControl.View> </dxg:GridControl> </ControlTemplate> </dxg:LookUpEdit.PopupContentTemplate> </dxg:LookUpEdit> </StackPanel> </DockPanel> </Border> </Popup> </StackPanel> </DataTemplate> </dxg:GridColumn.CellEditTemplate> </dxg:GridColumn>
Other binding types: {Binding ElementName=variantEditorColumn,Path=LookupItems1,Converter={StaticResource debugDummyConverter}} {Binding Path=LookupItems1, RelativeSource={RelativeSource Self}} {Binding Path=LookupItems1, RelativeSource={RelativeSource TemplatedParent}} {Binding Path=LookupItems1, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}} {Binding Path=DataContext.LookupItems1,RelativeSource={RelativeSource AncestorType={x:Type GridColumn}}}
Debug bindings
Create the class below, and register it as above. The debugger will break with the value parameter to the resolved binding.
Source: https://www.wpf-tutorial.com/data-binding/debugging/
public class DebugDummyConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Debugger.Break(); return value; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Debugger.Break(); return value; } }
Relative bindings in template:
<localPage:CorasauDataGridForeignKeyColumnClient x:Name="colVariant1" FieldName="Variant1" Visible="False"> <localPage:CorasauDataGridForeignKeyColumnClient.DisplayTemplate> <ControlTemplate> <TextBlock Margin="2" VerticalAlignment="Center" Text="{Binding DataContext.RowData.Row.Variant1,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" /> </ControlTemplate> </localPage:CorasauDataGridForeignKeyColumnClient.DisplayTemplate> <localPage:CorasauDataGridForeignKeyColumnClient.CellTemplate> <DataTemplate> <localPage:CorasauGridLookupEditorClient x:Name="PART_Editor" HasCustomLookUp="True" GotFocus="variant1_GotFocus" ItemsSource="{Binding DataContext.RowData.Row.Variant1Source,Mode=OneWay,RelativeSource={RelativeSource TemplatedParent}}"/> </DataTemplate> </localPage:CorasauDataGridForeignKeyColumnClient.CellTemplate> </localPage:CorasauDataGridForeignKeyColumnClient>
374800cookie-checkC# XAML nested and/or template bindings