绑定到ItemsSource不起作用

时间:2015-03-20 06:51:56

标签: c# wpf silverlight binding

我在XAML

中完成了以下操作
<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

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

但绑定仍无效!

似乎只接受第一次绑定。

稍后添加数据收集时,绑定更改似乎不会生效。

有任何帮助吗?感谢

4 个答案:

答案 0 :(得分: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 :(得分: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 rolloverModifier.SeriesData.SeriesInfo 已修改?

答案 2 :(得分:0)

您只需在您定义RolloverSeriesWithoutFirstData属性的类中实现INotifyPropertyChanged Interface。由于该属性没有setter,您必须手动提升{{1}每次更新集合时都会发生事件:

(伪代码):

NotifyPropertyChanged

答案 3 :(得分:-2)

更改

CursorLegendIC.DataContext = this.RolloverSeriesWithoutFirstData

CursorLegendIC.ItemsSource= this.RolloverSeriesWithoutFirstData

或者您可以在上面的答案中看到,删除后面的代码并使用clear mvvm