2013-01-07 77 views
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> 

The Content Binding provides a list of CheckBox items

以及設置器(當然,還有一個布爾型的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上。

...當然可以在這裏使用一點幫助, 謝謝。

回答

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上的註冊名稱。

+0

所以現在我已經安裝了ReSharper。我很想看看我聽說過這個產品是否屬實。 – Barton

+0

那麼,R#是我的兵工廠的一個很好的補充,但它沒有處理:RaisePropertyChanged(「WaasStatus」) – Barton

+0

嗯,事實證明,如果你嘗試使用VS重構,當你重命名一個標識符時彈出,R#沒有機會掃描匹配的文本。上下文菜單的R#部分提供了「重命名」,它具有搜索字符串文字的選項。 – Barton

相關問題