2014-03-28 32 views
1

我意識到我自己的日曆。 我做了一個Generic.xaml(ResourceDictionnary),其中包含我的新控件。我有一個Calendar.class誰實現:控制。ObservableCollection + ResourceDictionnary + Listbox PropertyChanged不起作用

在我的Calendar類中,我有一個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> 

索姆回覆之後:

我怎麼能這樣做?我要補充這樣的事在我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

我認爲你的'Tache'類需要實現'INotifyPropertyChanged'以及你對'Tache'對象進行修改以及需要通知UI的東西。 – XAMlMAX

+0

好的,我可以嘗試,但我只是添加或刪除ObservableCollection中的Tache ,我不改變Tache本身。 – trainor

+0

對不起,沒有正確地看你的代碼,你是正確的你的'Tache'類不需要實現'INotifyPropertyChanged',但你有沒有嘗試刪除'ListChange'中的'PropertyChanged'的空檢查? – XAMlMAX

回答

1

設計自定義的控制,這是習慣而不是DataContext設置爲this ...實際上,不要將它設置爲任何值,因爲這樣可以從控件之外設置它。相反,你應該使用RelativeSource Bindinggeneric.xaml引用您的財產:

<ListBox x:Name="ListeTaches" ItemsSource="{Binding ListeTache, RelativeSource={ 
    RelativeSource AncestorType={x:Type YourXamlNamespacePrefix:Calendar}}}" ... /> 

還應當指出的是,上ItemsSource Binding使用UpdateSourceTrigger=PropertyChanged, Mode=TwoWay是無意義的,因爲ItemsControl無法更新的源集合。

如果您仍然無法訪問該屬性,那麼您必須確保正確實施INotifyPropertyChanged interfaceCalendar.cs,或者你可以實現你的ListeTaches財產作爲DependencyProperty代替。


UPDATE >>>

你已經清楚地做錯事......這是真的那麼複雜。請按照我提供的鏈接在您的Calendar.cs課程中聲明DependencyProperty。做不是設置DataContext。使用我向您展示的RelativeSource Binding,正確設置正確的XAML名稱空間......就是這樣!

只是最後一件事...你確實添加一個WPF自定義控件庫項目到你的應用程序,不是嗎?你需要有這樣的事情在你的Calendar類的構造函數static

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

或許,如果你通過Control Authoring Overview頁面上MSDN閱讀,以確保你正在做正確,這將有助於?


更新2 >>>

好了,所以在發現您的意見以後有事,我想我知道你的問題是什麼。 @XAMlMAX問你

你試過在Listtache中刪除你的PropertyChanged的空檢查嗎?

你說

當我刪除它,我趕上TargetInvocationException。

我認爲這是你的問題......這意味着你PropertyChanged事件是null ......這意味着你必須附加一個處理程序,它尚未...它沒有被使用。嘗試附加一個處理程序,你的ListeTache集合應該顯示正常。

+0

謝謝,如果我添加RelativeSource到我的Xaml,我的ListBoxItem不綁定在我的日曆中。什麼都沒發生。 – trainor

+0

再次閱讀我的最後一段。 – Sheridan

+0

如果我刪除DataContext,我的日曆不加載。我試試你說的......也許我可以強制在Generic.xaml.cs代碼後面加載Reload? – trainor

相關問題