I'm currently working on a problem with a custom UserControl, I want to expose certain properties of child controls as properties on the parent, I also want data binding to be possible. To make all this happen, I created Attached DependencyProperties on the parent:
//TimeframeSelector.xaml.cs
public static readonly DependencyProperty EnableEndFilterProperty =
DependencyProperty.RegisterAttached(
"EnableEndFilter",
typeof(bool),
typeof(TimeframeSelector),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Inherits |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static bool GetEnableEndFilter(DependencyObject obj)
{
return (bool)obj.GetValue(EnableEndFilterProperty);
}
public static void SetEnableEndFilter(DependencyObject obj, bool value)
{
obj.SetValue(EnableEndFilterProperty, value);
}
public bool EnableEndFilter
{
get { return (bool)GetValue(EnableEndFilterProperty); }
set { SetValue(EnableEndFilterProperty, value); }
}
These Attached DPs are used in the xaml of that control:
//TimeframeSelector.xaml
<UserControl x:Class="EveTrader.Wpf.Controls.TimeframeSelector"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ctrl="clr-namespace:EveTrader.Wpf.Controls"
mc:Ignorable="d">
<CheckBox IsChecked="{Binding
Path=(ctrl:TimeframeSelector.EnableEndFilter),
RelativeSource={RelativeSource Self}, Mode=TwoWay}"/>
</UserControl>
Now, the control is used in another control:
<ctrl:TimeframeSelector EnableEndFilter="{Binding ApplyEndFilter}" [...]/>
The ViewModel for this View supplies a value from user settings, which gets displayed correctly in the control, but any changes made in the control don't go back to the ViewModel.
So the question is: How do I get the control to work both ways? Something already has to work, otherwise the control would be empty (as it was before I added the Inherits flag to the DP).