Правильная привязка шаблона к DependencyProperty
Я знаю, что это было неправильно, когда я написал это, и я смог собрать большую часть ответа для другого ответа, но просто не могу понять последний момент. Привязка передается из пользовательского интерфейса в DependencyProperty (и другим способом при создании элемента управления).
Мой шаблон (необходимо переместить привязку IsChecked к экземпляру):
<ControlTemplate x:Key="MyHeaderedContentTemplate" TargetType="HeaderedContentControl">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<ContentControl>
<StackPanel Orientation="Horizontal">
<CheckBox Margin="2,2,20,2"
Content="All/None"
IsChecked="{Binding Path=AllFeatureTypesChecked, Mode=TwoWay}" />
<TextBlock Text="{TemplateBinding Header}" Margin="2"/>
</StackPanel>
</ContentControl>
<ContentControl Grid.Row="1" Content="{TemplateBinding Content}" />
</Grid>
Экземпляр:
<HeaderedContentControl Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Grid.ColumnSpan="2" Margin="4"
Template="{StaticResource ResourceKey=MyHeaderedContentTemplate}"
Header="Feature Details by Type">
<HeaderedContentControl.Resources>
</HeaderedContentControl.Resources>
<ListBox ItemTemplate="{StaticResource SelectableLinkNode}"
ItemsSource="{Binding Features}"/>
</HeaderedContentControl>
И Сеттер (конечно, есть логический AllFeatureTypesChecked DependencyProperty):
/// <summary>
/// Needs to be set on Startup and on ItemIsCheckedChanged Event from the Features List
/// </summary>
private void SetAllSelectedState()
{
bool allSelected = (Features.Count > 0);
foreach (var CheckableItem in Features) {
if (CheckableItem.IsChecked == false) {
allSelected = false;
break;
}
}
SetCurrentValue(AllFeatureTypesCheckProperty, allSelected);
}
Для справки, вот DP
public static readonly DependencyProperty AllFeatureTypesCheckProperty =
DependencyProperty.Register("AllFeatureTypesCheck", typeof(Boolean), typeof(ReportSources),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnAllFeatureTypesCheckedChanged));
Это действительно забавная штука, и я не смог бы сделать это без удивительных людей здесь, на SO! Спасибо!
ОБНОВЛЕНИЕ: Хорошо, теперь у меня есть это (мозговой штурм):
<ControlTemplate x:Key="MyHeaderedContentTemplate" TargetType="HeaderedContentControl">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<ContentControl>
<StackPanel Orientation="Horizontal">
<ContentPresenter Content="{DynamicResource ResourceKey=CheckControl}" Margin="2,2,20,2"/>
<TextBlock Text="{TemplateBinding Header}" Margin="2"/>
</StackPanel>
</ContentControl>
<ContentControl Grid.Row="1" Content="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
инстанцируется так:
<HeaderedContentControl Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Grid.ColumnSpan="2" Margin="4"
Template="{StaticResource ResourceKey=MyHeaderedContentTemplate}"
Header="Feature Details by Type"
>
<HeaderedContentControl.Resources>
<CheckBox x:Key="CheckControl"
Content="All/None"
IsThreeState="True"
IsChecked="{Binding Path=AllFeatureTypesChecked, Mode=TwoWay}"
/>
</HeaderedContentControl.Resources>
<ListBox ItemTemplate="{StaticResource SelectableLinkNode}"
ItemsSource="{Binding Features}"/>
</HeaderedContentControl>
но по-прежнему не удается получить значение, установленное на DP, для отображения в пользовательском интерфейсе после создания элемента управления.
... конечно, можно использовать небольшую помощь здесь, спасибо.
1 ответ
Глупо, правда - или совсем глупо... Но я обвиняю использование строк для регистрации. IDE просто не делает достаточно, чтобы попытаться обновить такие вещи, когда изменяется написание идентификатора.
public Boolean? AllFeatureTypesChecked
{
get { return (Boolean?) GetValue(AllFeatureTypesCheckedProperty); }
set { SetValue(AllFeatureTypesCheckedProperty, value); }
}
#region Using a DependencyProperty as the backing store for AllFeatureTypesCheck. This enables animation, styling, binding, etc...
public static readonly DependencyProperty AllFeatureTypesCheckedProperty =
DependencyProperty.Register("AllFeatureTypesCheck", typeof(Boolean?), typeof(ReportSources),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnAllFeatureTypesCheckedChanged));
#endregion
Обратите внимание на написание на объекте собственности против зарегистрированного имени на DP.