1
我知道這是不正確的,當我寫它,我已經能夠收集大部分another answer的答案,但只是無法抓住最後一點。 綁定不會從UI傳遞到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));
這是非常有趣的東西,並沒有真棒鄉親我不能這樣做,在這裏如此! 謝謝!
UPDATE:OK,現在我有這個(頭腦風暴):
<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值設置爲顯示在控件創建後的UI上。
...當然可以在這裏使用一點幫助, 謝謝。
所以現在我已經安裝了ReSharper。我很想看看我聽說過這個產品是否屬實。 – Barton
那麼,R#是我的兵工廠的一個很好的補充,但它沒有處理:RaisePropertyChanged(「WaasStatus」) – Barton
嗯,事實證明,如果你嘗試使用VS重構,當你重命名一個標識符時彈出,R#沒有機會掃描匹配的文本。上下文菜單的R#部分提供了「重命名」,它具有搜索字符串文字的選項。 – Barton