2013-01-19 66 views
1

我建立一个自定义的控制,我想收集传递给它,以便控制显示该集合,我的代码如下:如何绑定收集到自定义控件在WPF

<gm:Calendar SubscriptionSource="{Binding Subscriptions}"></gm:Calendar> 

,并在自定义控制 “日历”

public static readonly DependencyProperty SubscriptionSourceProperty = 
    DependencyProperty.Register(
     "SubscriptionSource", 
     typeof(ObservableCollection<Subscription>), 
     typeof(Calendar), 
     new FrameworkPropertyMetadata(new ObservableCollection<Subscription>())); 

public ObservableCollection<Subscription> SubscriptionSource 
{ 
    get 
    { 
     return (ObservableCollection<Subscription>)GetValue(SubscriptionSourceProperty); 
    } 
    set 
    { 
     SetValue(SubscriptionSourceProperty, value); 
    } 
} 

我在generic.xaml使用

<ItemsControl ItemsSource="{Binding SubscriptionSource}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <!--Box--> 
      <Border BorderBrush="Black" BorderThickness="1" Padding="0"> 
       <Border Name="InnerBorder" BorderBrush="{Binding Path=Day, Converter={StaticResource DayBorderColorConverter}}" BorderThickness="2"> 
        <Border.Style> 
         <Style TargetType="{x:Type Border}"> 
          <Style.Triggers> 
           <!--Current Day--> 
           <DataTrigger Binding="{Binding IsToday}" Value="true"> 
            <Setter Property="Border.Background"> 
             <Setter.Value> 
              <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
               <GradientStop Color="#FF1EA6C8" Offset="0"/> 
               <GradientStop Color="#FF0691B3" Offset="1"/> 
              </LinearGradientBrush> 
             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <DockPanel> 
         <!--Day Number--> 
         <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" FlowDirection="RightToLeft"> 
          <TextBlock TextAlignment="Right" Text="{Binding Day.Date, Converter={StaticResource DateConverter}, ConverterParameter=DAY}" FontSize="12" Margin="5,5,5,5" > 
           <TextBlock.Style> 
            <Style TargetType="{x:Type TextBlock}"> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding IsTargetMonth}" Value="false"> 
               <Setter Property="TextBlock.Foreground" Value="Gray"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </TextBlock.Style> 
          </TextBlock> 
         </StackPanel> 
         <CheckBox IsEnabled="{Binding IsEnabled}" Style="{StaticResource DiscreteCheckBoxStyle}" /> 
        </DockPanel> 
       </Border> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="6" Columns="7" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

我要绑定订阅表外实体可收集的日历自定义控件,所以我可以使用自定义控件中的集合,是否有这样做?

+0

在构造函数中,依赖项属性的值将为空,因为那时WPF甚至没有构建控件,更不用说为赋值依赖项属性赋值了。您最好在依赖项属性上使用PropertyChangedCallback,而不是尝试访问构造函数中的列表。 –

+0

感谢您的回复,因为您可以看到我想将订阅可观察集合绑定到日历自定义控件,因此我可以在自定义控件中使用该集合,是否需要执行此操作? –

+0

就像我说的,使用PropertyChangedCallback,您将能够访问自定义控件中的集合。第一个Google搜索结果:http://stackoverflow.com/questions/5498517/how-to-use-propertychangedcallback。 –

回答

0

我的问题是解决了,现在由于@Luke伍德沃德和我只是我使用内部用户控件自定义控件另一个问题,并且为用户控件内部的ListItem 一个项目I修饰的结合表达

<gm:Calendar SubscriptionSource="{Binding Path=Subscriptions,Mode=TwoWay}" > 

和customcontrol是

static Calendar() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(Calendar), new FrameworkPropertyMetadata(typeof(Calendar))); 
    } 

    public ObservableCollection<SubscriptionDay> SubscriptionSource 
    { 
     get { return (ObservableCollection<SubscriptionDay>)GetValue(SubscriptionSourceProperty); } 
     set { SetValue(SubscriptionSourceProperty, value); } 
    } 

    public static readonly DependencyProperty SubscriptionSourceProperty = 
     DependencyProperty.Register("SubscriptionSource", typeof(ObservableCollection<SubscriptionDay>), typeof(Calendar), new FrameworkPropertyMetadata(new ObservableCollection<SubscriptionDay>())); 

和修改@HighCore的Generic.xaml发布

<ItemsControl ItemsSource="{TemplateBinding SubscriptionSource}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate>...... 

终于摸索。 感谢@Luke Woodward和@HighCore

0

如果ItemsControlControlTemplate里面,然后更改为{Binding SubscriptionSource}{TemplateBinding SubscriptionSource}

+0

我尝试了{TemplateBinding SubscriptionSource},但仍收集空集。 –

+0

您确定实际的集合正确地绑定到控件吗?我的意思是,检查VS输出窗口,看看是否有任何绑定错误。否则,使用Snoop检查正在运行的应用程序并检查控件及其可视子项的状态。 –

+0

我试图将订阅列表绑定到列表框作为测试,它正在工作,但我需要的是将列表绑定到自定义控件 –