C# 绑定到ItemsSource不工作
我在XAML中完成了以下工作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>
<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)的所有者没有收到更改通知。创建您自己的事件,或者实现etINotifyPropertyChanged
。我用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));
}