我意识到自己的日历。 我做了一个包含我的新控件的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();
}
我从未接触到这个事件......
全部谢谢
答案 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
集合应该显示正常。