I'm having trouble creating a DependencyProperty of type "Binding". Other types work ok, and they resolve successfully if I populate them using a binding.
In my scenario I want to grab the raw binding, so that I can use it to bind to properties of child objects, in much the same way that DataGrid does columns - ie for each binding specified in a column, it binds to each of the items in the ItemsSource collection, rather than binding the the DataContext itself.
<mg:MultiSelectDataGrid x:Name="Grid" DockPanel.Dock="Left"
ItemsSource="{Binding Path=Rows}" DataContext="{Binding}"
AutoGenerateColumns="False" UriBinding="{Binding Path=UrlItems}">
And in my "MultiSelectDataGrid":
public static readonly DependencyProperty UriBindingProperty =
DependencyProperty.Register("UriBinding", typeof(BindingBase),
typeof(MultiSelectDataGrid),
new PropertyMetadata { PropertyChangedCallback = OnBindingChanged});
private static void OnBindingChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
// This is never enterred
}
public BindingBase UriBinding
{
get { return (BindingBase)GetValue(UriBindingProperty); }
set { SetValue(UriBindingProperty, value); }
}
The callback never gets called, and the property never gets set. I've tried all kinds of permutations, with callbacks, without. The only thing that gave me any success was if I replaced the binding with a string (eg UriBinding="hello") - in that case it would fire the callback, and set the property, but would, of course, fail because it's the wrong type.
What am I doing wrong? I've seen a whole load of examples of this, and I guess this is what DataGrid must be doing itself.
Thanks
Curiously only other place I am aware of that has Binding
type property is DataGridBoundColumn
class which derives into DataGridTextColumn
, DataGridCheckBoxColumn
etc...
And interestingly there the property is NOT a dependency property. It is a plain CLR type property. I guess the infrastructre of binding is based upon the limitation that you cannot bind to binding type DP.
Other properties of the same class are very well DPs like Visibility, Header etc.
In DataGridBoundColumn
the Binding
property is declared as below with a very crude explanation for the same ...
This isn't a DP because if it were getting the value would evaluate the binding.
/// <summary>
/// The binding that will be applied to the generated element.
/// </summary>
/// <remarks>
/// This isn't a DP because if it were getting the value would evaluate the binding.
/// </remarks>
public virtual BindingBase Binding
{
get
{
if (!_bindingEnsured)
{
if (!IsReadOnly)
{
DataGridHelper.EnsureTwoWayIfNotOneWay(_binding);
}
_bindingEnsured = true;
}
return _binding;
}
set
{
if (_binding != value)
{
BindingBase oldBinding = _binding;
_binding = value;
CoerceValue(IsReadOnlyProperty);
CoerceValue(SortMemberPathProperty);
_bindingEnsured = false;
OnBindingChanged(oldBinding, _binding);
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With