2015-03-20 2 views
0

я сделал следующее в XAMLBinding к ItemsSource не работает

<ItemsControl x:Name="CursorLegendIC" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding}" Margin="0,0" Padding="0,0,0,-300"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Vertical"> 
          <Ellipse Width="8" Height="8" HorizontalAlignment="Left" Margin="0,0,0,-16" Fill="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" /> 
          <TextBlock Margin="10,0,0,0" HorizontalAlignment="Left" TextWrapping="Wrap" FontSize="11" FontWeight="Bold" Foreground="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" Text="{Binding SeriesName}"/> 
          <TextBlock FontSize="11" HorizontalAlignment="Left" TextWrapping="Wrap" Margin="10,-3,0,4" Foreground="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" Text="{Binding YValue, StringFormat=\{0:0.000\}}" /> 
          <TextBlock FontSize="11" HorizontalAlignment="Left" TextWrapping="Wrap" Margin="10,-8,0,4" Foreground="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" Text="{Binding RenderableSeries.YAxisId}"/> 
         </StackPanel> 
        </DataTemplate>       
       </ItemsControl.ItemTemplate>      
      </ItemsControl>  

И я поставил контекст данных соответственно:

void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 

     CursorLegendIC.DataContext = this.RolloverSeriesWithoutFirstData; 
    } 

И установите Observable коллекции собственность как общественное

public ObservableCollection<SeriesInfo> RolloverSeriesWithoutFirstData 
    { 
     get 
     { 
      ObservableCollection<SeriesInfo> Temp = rolloverModifier.SeriesData.SeriesInfo; 
      return Temp; 
     } 
    } 

Но привязка все еще не работает!

Кажется, что требуется только привязка в первом случае.

Когда сбор данных будет добавлен позже, изменения привязки, похоже, не вступят в силу.

Любая помощь? Благодаря

+0

Мое предположение заключается в том, что вы обновляете сбор асинхронно, что 'INotifyCollectionChanged' не поддерживает, или вы заменяете значение экземпляра свойства' RolloverSeriesWithoutFirstData', не указав привязку, что значение было изменено (Implement 'INotifyPropertyChanged 'и поднять событие внутри метода set) – Anders

+0

Если вы обновите async, вы можете либо это сделать, если на .NET 4.5 или выше: [Как обновить ObservableCollection через рабочий поток?] (http://stackoverflow.com/ a/14602121/1548864) или это, если ниже [AsyncObservableCollection] (https://gist.github.com/thomaslevesque/10023516) (ПРИМЕЧАНИЕ: экземпляр коллекции должен быть создан в потоке пользовательского интерфейса) – Anders

+0

Извините .. Не видел вы получили доступ только к свойству .. Вы меняете экземпляр 'rolloverModifier.SeriesData.SeriesInfo', или он остается прежним? – Anders

ответ

1

Ваш вопрос о том, что экземпляр (вся коллекция) изменяется свойство SeriesInfo без владельца RolloverSeriesWithoutFirstData (позволяет называть его MyWindow) уведомляется об изменении. Либо сделайте свое собственное событие, либо введите INotifyPropertyChanged. Я привел пример с INPC:

class SeriesData : INotifyPropertyChanged 
{ 
    private ObservableCollection<SeriesInfo> _seriesInfo; 
    public ObservableCollection<SeriesInfo> SeriesInfo 
    { 
     set{ SetProperty(ref _seriesInfo, value); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private bool SetProperty<T>(ref T storage, T value, [CallermemberName] string propertyName = null) 
    { 
     if(Equals(storage,value)) return false; 
     storage = value; 

     var handler = PropertyChanged; 
     if(handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     return true; 
    } 
} 

В MyWindow вы это делает:

class MyWindow : Window, INotifyPropertyChanged 
{ 
    public ObservableCollection<SeriesInfo> RolloverSeriesWithoutFirstData 
    { 
     get{ return rolloverModifier.SeriesData.SeriesInfo; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public MyWindow() 
    { 
     // Get rolloverModifier 
     rolloverModifier.SeriesData.PropertyChanged += SeriesDataPropertyChanged; 
    } 

    private void SeriesDataPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     switch(e.PropertyName) 
     { 
      case "SeriesInfo": 
       RaisePropertyChanged("RolloverSeriesWithoutFirstData"); 
       break; 
     } 
    } 

    private void RaisePropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if(handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

Теперь SeriesData уведомляет его слушатели (наш случай MyWindow), что один из его свойств изменилось значение. MyWindow затем передаст это уведомление своим слушателям (привязкам), что это свойство: RolloverSeriesWithoutFirstData изменилось.

+1

Спасибо, это решило это .. новичок ошибка (Shoot me пожалуйста) – user1034912

0

Предполагая, что вы используете MVVM шаблон, вы должны удалить код позади и просто привязку к ObservableCollection:

<ItemsControl x:Name="CursorLegendIC" Grid.Column="0" Grid.Row="1" ItemsSource="{Binding RolloverSeriesWithoutFirstData}" Margin="0,0" Padding="0,0,0,-300"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Vertical"> 
         <Ellipse Width="8" Height="8" HorizontalAlignment="Left" Margin="0,0,0,-16" Fill="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" /> 
         <TextBlock Margin="10,0,0,0" HorizontalAlignment="Left" TextWrapping="Wrap" FontSize="11" FontWeight="Bold" Foreground="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" Text="{Binding SeriesName}"/> 
         <TextBlock FontSize="11" HorizontalAlignment="Left" TextWrapping="Wrap" Margin="10,-3,0,4" Foreground="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" Text="{Binding YValue, StringFormat=\{0:0.000\}}" /> 
         <TextBlock FontSize="11" HorizontalAlignment="Left" TextWrapping="Wrap" Margin="10,-8,0,4" Foreground="{Binding SeriesColor, Converter={StaticResource ColorToBrushConverter}}" Text="{Binding RenderableSeries.YAxisId}"/> 
        </StackPanel> 
       </DataTemplate>       
      </ItemsControl.ItemTemplate>      
     </ItemsControl> 

+ Вопросы: что такое rolloverModifier? is rolloverModifier.SeriesData.SeriesInfo изменен?

+0

Спасибо за ответ. Да. Просто все еще не работает – user1034912

+0

Ваша модель просмотра реализует INotifyPropertyChanged? Если да, можете ли вы попробовать обновление вручную при обновлении списка? Например: OnPropertyChange («RolloverSeriesWithoutFirstData»); –

+0

Вы можете попробовать также добавить viewmodel в качестве статического ресурса. –

-2

Изменить

CursorLegendIC.DataContext = this.RolloverSeriesWithoutFirstData 

для

CursorLegendIC.ItemsSource= this.RolloverSeriesWithoutFirstData 

Или, как вы можете видеть в ответе выше, удалите код позади и использовать четкие MVVM

+0

Это ничего не решит. – Sheridan

0

Вам просто нужно реализовать INotifyPropertyChanged Interface в класс, который вы определили в свой RolloverSeriesWithoutFirstData. У этого имущества нет setter, вам придется вручную поднять NotifyPropertyChanged ev лор при обновлении коллекции:

(псевдо-код):

rolloverModifier.SeriesData.SeriesInfo = DataAccess.GetNewCollection(); 
NotifyPropertyChanged("RolloverSeriesWithoutFirstData"); 
Смежные вопросы