ObservableCollection + ResourceDictionnary + Listbox PropertyChanged不起作用

时间:2014-03-28 08:02:45

标签: c# wpf xaml calendar

我意识到自己的日历。 我做了一个包含我的新控件的Generic.xaml(ResourceDictionnary)。我有一个Calendar.class实现:Control。

在我的日历课程​​中,我有一个ObservableCollection<Day> _days。我把DataContext = this;

一天包含我的ObservableCollection<MyObject> ListeTache。 和Day.Class实现INotifyPropertyChanged并举办我的活动:

public event PropertyChangedEventHandler PropertyChanged;

但是当我更新我的列表框时,我必须手动重新加载我的日历以查看任何更改。 我错过了什么吗?

感谢您的帮助。

我的ObservableCollection<MyObject>

public ObservableCollection<Tache> ListeTache
{
    get { return this._listeTache; }
    set
    {
        _listeTache = value;
        if (PropertyChanged != null)
        {
        PropertyChanged(this, new PropertyChangedEventArgs("ListeTache"));
        }
    }
}

我的Generic.xaml看起来像这样:

<Grid x:Name="LayoutTache">
    <ListBox x:Name="ListeTaches" ItemsSource="{Binding ListeTache,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" FontSize="10" PreviewMouseDown="PreviewMouseDownClick_clear" MouseDoubleClick="doubleClic" IsSynchronizedWithCurrentItem="False">

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                     <TextBlock Text="{Binding AffichageCalendrier}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Resources>
            <ContextMenu x:Key="MonMenu">
                <MenuItem Header="Supprimer" Click="MonMenuDel_Click" />
            </ContextMenu>
        </ListBox.Resources>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="AntiqueWhite"></Setter>
                        <Setter Property="ContextMenu" Value="{StaticResource MonMenu}"/>
                    </Trigger>
                </Style.Triggers>
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightGreen" />
                </Style.Resources>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
</Grid>

在somme回复之后:

我怎么能这样做?我必须在Day.cs课程中添加类似的东西:

 _listeTache.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_listeTache_CollectionChanged);

void _listeTache_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            throw new NotImplementedException();
        }

我从未接触到这个事件......

全部谢谢

1 个答案:

答案 0 :(得分:1)

在设计自定义控件时,习惯上DataContext设置为this ...实际上,不要将其设置为任何内容这使它可以从控件外部设置。相反,您应该使用RelativeSource Binding

generic.xaml引用您的媒体资源
<ListBox x:Name="ListeTaches" ItemsSource="{Binding ListeTache, RelativeSource={
    RelativeSource AncestorType={x:Type YourXamlNamespacePrefix:Calendar}}}" ... />

还应该注意,在UpdateSourceTrigger=PropertyChanged, Mode=TwoWay上使用ItemsSource Binding毫无意义,因为ItemsControl无法更新源集合。

如果您仍然无法访问该媒体资源,则必须确保在Calendar.cs中正确实施INotifyPropertyChanged interface,或者您可以将ListeTaches媒体资源实施为而是DependencyProperty


更新&gt;&gt;&gt;

你明显做错了什么......它的真的并不那么复杂。按照我提供的链接在DependencyProperty课程中声明Calendar.cs设置DataContext。使用我向您展示的RelativeSource Binding,正确设置正确的XAML命名空间......就是这样!

最后一件事......你 将WPF自定义控件库项目添加到您的应用程序中,不是吗?你需要在Calendar课程中提供类似的内容。 static构造函数:

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

如果您通读MSDN上的Control Authoring Overview页面以确保正确执行此操作,这可能会有所帮助吗?


更新2&gt;&gt;&gt;

好的,所以在注意到你的评论后,我想我知道你的问题是什么。 @XAMlMAX问你

  

您是否尝试在Listtache中删除PropertyChanged的空检查?

您回复了

  

当我删除它时,我捕获TargetInvocationException。

我认为这是您的问题...这意味着您的PropertyChanged事件为null ...这意味着您附加了它的处理程序......它没有被使用。尝试将处理程序附加到它,您的ListeTache集合应该显示正常。