C# 绑定到ItemsSource不工作

C# 绑定到ItemsSource不工作,c#,wpf,silverlight,binding,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>

我在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>      
并将可观察集合属性设置为public

public ObservableCollection<SeriesInfo> RolloverSeriesWithoutFirstData
    {
        get
        {
            ObservableCollection<SeriesInfo> Temp = rolloverModifier.SeriesData.SeriesInfo;
            return Temp;
        }
    }
public observeablecollection RolloverSeriesWithoutFirstData
{
收到
{
ObservableCollection Temp=rolloverModifier.SeriesData.SeriesInfo;
返回温度;
}
}
但是绑定仍然不起作用

它似乎只是在第一时间进行绑定

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


有什么帮助吗?谢谢

假设您使用的是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.SeriesData.SeriesInfo是否已修改?

更改

CursorLegendIC.DataContext = this.RolloverSeriesWithoutFirstData
为了


或者,正如您在上面的答案中所看到的,删除隐藏的代码并使用clear mvvm,您只需要在中定义的类中实现您的
RolloverSeriesWithoutFirstData
属性。由于该属性没有
setter
,因此每当更新集合时,您必须手动引发
NotifyPropertyChanged
事件:

(伪代码):


您的问题是属性
SeriesInfo
的实例(整个集合)发生更改,而
RolloverSeriesWithoutFirstData
(我们称之为MyWindow)的所有者没有收到更改通知。创建您自己的事件,或者实现et
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;
    }
}
class系列数据:INotifyPropertyChanged
{
私人可观测收集_seriesInfo;
公共可观测收集系列信息
{
set{SetProperty(ref _serieinfo,value);}
}
公共事件属性更改事件处理程序属性更改;
私有bool SetProperty(ref T storage,T value,[CallermemberName]string propertyName=null)
{
if(等于(存储,值))返回false;
储存=价值;
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyName));
返回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));
    }
类MyWindow:Window,INotifyPropertyChanged
{
不使用第一个数据的公共可观测收集滚动周期
{
获取{return rolloverModifier.SeriesData.SeriesInfo;}
}
公共事件属性更改事件处理程序属性更改;
公共MyWindow()
{
//获取滚动修改器
rolloverModifier.SeriesData.PropertyChanged+=SeriesDataPropertyChanged;
}
私有void序列DataPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
开关(如PropertyName)
{
案例“SeriesInfo”:
RaisePropertyChanged(“RolloverSeriesWithoutFirstData”);
打破
}
}
私有void RaisePropertyChanged([CallerMemberName]字符串propertyName=null)
{
var handler=PropertyChanged;
if(处理程序!=null)
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}

现在
SeriesData
通知它的侦听器(我们的案例
MyWindow
)它的一个属性的值已更改。
MyWindow
然后将该通知转发给它的侦听器(绑定)它的属性:
RolloverSeriesWithoutFirstData
已更改。

我的猜测可能是,您正在异步更新集合,这是
INotifyCollectionChanged
不支持的,或者您正在替换属性
RolloverSeriesWithoutFirstData
的实例值,而不告诉绑定值已更改(实现
INotifyPropertyChanged
并在set方法内引发事件)如果更新async,则可以在.NET 4.5或更高版本上使用此值:或在以下情况下使用此值(注意:集合实例必须在UI线程上创建)抱歉..没有看到您对属性有一个get only..您是否更改了
rolloverModifier.SeriesData.SeriesInfo
的实例,还是保持不变?好的..这是因为
SeriesInfo
发生了更改,但是没有通知
RolloverSeriesWithoutFirstData
的所有者此更改。您需要
SeriesDat中的事件一个
,它告诉
RolloverSeriesWithoutFirstData
的所有者
SeriesInfo
已更改。然后
RolloverSeriesWithoutFirstData
的所有者需要实现
INotifyPropertyChanged
来告诉绑定
RolloverSeriesWithoutFirstData
已更改。然后ItemsSource将更新e、 我已经发布了一个解决您问题的答案。感谢您的回复。是的。只是仍然不工作您的viewmodel实现INotifyPropertyChanged?如果是,您可以在更新列表时尝试手动刷新吗?例如:OnPropertyChange(“RolloverSeriesWithoutFirstData”);您也可以尝试将viewmodel添加为静态资源。实际上,我的视图模型是“public ObservableCollection RolloverSeriesWithoutFirstData”。它是主页的一部分,即用户控件
rolloverModifier.SeriesData.SeriesInfo = DataAccess.GetNewCollection();
NotifyPropertyChanged("RolloverSeriesWithoutFirstData");
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;
    }
}
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));
    }