绑定到 ItemsSource 不起作用

Binding to ItemsSource not working

我在 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;
        }
    }

但是绑定还是不行!

好像只在第一个实例中绑定。

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

有什么帮助吗?谢谢

假设您使用的是 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>  

+问题:什么是 rolloverModifierrolloverModifier.SeriesData.SeriesInfo被修改了吗?

改变

CursorLegendIC.DataContext = this.RolloverSeriesWithoutFirstData

CursorLegendIC.ItemsSource= this.RolloverSeriesWithoutFirstData

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

您只需要在 RolloverSeriesWithoutFirstData 属性 中定义的 class 中实现 INotifyPropertyChanged Interface。因为 属性 没有 setter,您必须在更新集合时手动引发 NotifyPropertyChanged 事件:

(伪代码):

rolloverModifier.SeriesData.SeriesInfo = DataAccess.GetNewCollection();
NotifyPropertyChanged("RolloverSeriesWithoutFirstData");

您的问题是 属性 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 已更改。