C# WPF ObservableCollection未更新视图
这是xaml部分C# WPF ObservableCollection未更新视图,c#,wpf,observablecollection,C#,Wpf,Observablecollection,这是xaml部分 <ItemsControl x:Name="EventsTop"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Margin="0,1,0,0"> <Bu
<ItemsControl x:Name="EventsTop">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,1,0,0">
<Button Content="{Binding Name}" Template="{DynamicResource ButtonFirst}" Height="50" Margin="15,0,0,0" Padding="10,0,15,0" FontSize="19" FontFamily="/Resources/Fonts/Font Awesome/#FontAwesome" BorderThickness="5,0,0,0" BorderBrush="#8CC152" Background="#2980B9" HorizontalContentAlignment="Left" Foreground="Black" Click="TabOpen" Tag="{Binding Id}"></Button>
<StackPanel Background="#2980B9" Margin="15,0,0,5" Visibility="Collapsed" AllowDrop="True" Tag="{Binding Id}" Drop="RowDrop">
<Border BorderThickness="5,0,0,0" BorderBrush="#8CC152">
<StackPanel>
<DockPanel LastChildFill="False">
<Label DockPanel.Dock="Left" Width="140" Content="Date" FontSize="19" BorderThickness="0,0,0,1" FontFamily="/Resources/Fonts/Open Sans/#Open Sans" BorderBrush="Black" HorizontalContentAlignment="Center"></Label>
<Label DockPanel.Dock="Left" Width="190" Content="Event" FontSize="19" BorderThickness="0,0,0,1" FontFamily="/Resources/Fonts/Open Sans/#Open Sans" BorderBrush="Black" HorizontalContentAlignment="Center"></Label>
<Label DockPanel.Dock="Left" Width="100" Content="Select" FontSize="19" BorderThickness="0,0,0,1" FontFamily="/Resources/Fonts/Open Sans/#Open Sans" BorderBrush="Black" HorizontalContentAlignment="Center"></Label>
</DockPanel>
<ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="150">
<ItemsControl ItemsSource="{Binding Details}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel LastChildFill="False">
<Label Content="{Binding Date}" DockPanel.Dock="Left" Width="140" FontSize="19" BorderThickness="0" FontFamily="/Resources/Fonts/Open Sans/#Open Sans" BorderBrush="Black" HorizontalContentAlignment="Center"></Label>
<Label Content="{Binding EventName}" DockPanel.Dock="Left" Width="165" FontSize="19" BorderThickness="0" FontFamily="/Resources/Fonts/Open Sans/#Open Sans" BorderBrush="Black" HorizontalContentAlignment="Center"></Label>
<Border Width="97">
<CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding Checked}"></CheckBox>
</Border>
<Button Width="25" DockPanel.Dock="Left" Content="" BorderThickness="0" Background="Transparent" FontFamily="/Resources/Fonts/Font Awesome/#FontAwesome"></Button>
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</StackPanel>
</Border>
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
还有我的模型收藏
class Sport : INotifyPropertyChanged
{
private int _id;
private string _name = string.Empty;
private ObservableCollection<Details> _details = new ObservableCollection<Details>();
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged("Content");
}
}
public ObservableCollection<Details> Details
{
get { return _details; }
set { _details = value; }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
MessageBox.Show(info);
}
}
}
第二次更新
我发现,当我使用窗口激活事件时,它正在解决名为传递给NotifyPropertyChanged方法的属性的问题。参数的名称应为属性名称。请将Name属性更改为
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged("Name");
}
}
名为的属性的问题已传递给NotifyPropertyChanged方法。参数的名称应为属性名称。请将Name属性更改为
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged("Name");
}
}
使用可避免必须获得正确的名称并允许重构:
private void NotifyPropertyChanged([CallerMemberName] string info = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
MessageBox.Show(info);
}
}
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged(); //now no need to specify
}
}
每个属性设置程序都应通知属性更改,因此:
public IEnumerable<Details> Details //note IEnumerable, no calling code needs to know its concrete type
{
get { return _details; }
set
{
_details = value;
NotifyPropertyChanged();
}
}
有了一台电脑,你就可以做到这一点:
private readonly ObservableRangeCollection<Details> _details = new ObservableRangeCollection<Details>();
public IEnumerable<Details> Details
{
get { return _details; }
set { _details.Replace(value); }
}
使用可避免必须获得正确的名称并允许重构:
private void NotifyPropertyChanged([CallerMemberName] string info = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
MessageBox.Show(info);
}
}
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged(); //now no need to specify
}
}
每个属性设置程序都应通知属性更改,因此:
public IEnumerable<Details> Details //note IEnumerable, no calling code needs to know its concrete type
{
get { return _details; }
set
{
_details = value;
NotifyPropertyChanged();
}
}
有了一台电脑,你就可以做到这一点:
private readonly ObservableRangeCollection<Details> _details = new ObservableRangeCollection<Details>();
public IEnumerable<Details> Details
{
get { return _details; }
set { _details.Replace(value); }
}
从
在添加、删除、更改、移动项目或整个项目时发生
列表已刷新
更改并不意味着子属性何时更改,而是指在任何索引处更改项时
因此,在修改集合项时,需要通知绑定属性已更改。修改集合中的项目后,将从窗口的viewmodel中通知集合已更改
NotifyPropertyChanged("AllEvents");
从
在添加、删除、更改、移动项目或整个项目时发生
列表已刷新
更改并不意味着子属性何时更改,而是指在任何索引处更改项时
因此,在修改集合项时,需要通知绑定属性已更改。修改集合中的项目后,将从窗口的viewmodel中通知集合已更改
NotifyPropertyChanged("AllEvents");
我找到了解决办法
因此,ObservableCollection工作得很好,但需要刷新
为了出现在视野中,我们需要使用
CollectionViewSource.GetDefaultViewObservableCollection.Refresh
它的方法
我想这会对我找到解决办法的人有所帮助
因此,ObservableCollection工作得很好,但需要刷新
为了出现在视野中,我们需要使用
CollectionViewSource.GetDefaultViewObservableCollection.Refresh
它的方法
我认为它将帮助某人替换NotifyPropertyChangedContent;通过NotifyPropertyChangedName;。您好,我更改了它,但它不工作yetShow代码,您可以在其中更改值。是此行吗:AllEvents[0]。Name=1;?请显示AllEvents的声明HI,我添加了部分声明,替换NotifyPropertyChangedContent;通过NotifyPropertyChangedName;。您好,我更改了它,但它不工作yetShow代码,您可以在其中更改值。是此行吗:AllEvents[0]。Name=1;?请显示AllEvents的声明Hi,我添加了声明的一部分,Template={DynamicSource ButtonFirst}它覆盖了button的内容dp吗?它只是button的模板当我向AllEvents添加项时,它的更新GUI是否更新绑定集合的相同实例Template={DynamicSource ButtonFirst}它是否覆盖了按钮的内容dp?它只是按钮的模板当我将项添加到AllEvents及其更新GUI时,您是否正在更新绑定集合的同一个实例?在实现INotifyPropertyChanged的过程中,这些要点应该对OP有所帮助,但是在本例中需要刷新的集合是AllEvents,它似乎是实际视图的一部分,而不是viewmodel。在这种情况下,集合永远不会重新设置。谢谢!在实现INotifyPropertyChanged的过程中有很多优点,它们应该对OP有所帮助,但在本例中需要刷新的集合是AllEvents,它似乎是实际视图的一部分,而不是viewmodel。在这种情况下,集合永远不会重新设置。谢谢!这是为了我。非常感谢分享!在过去的两天里,我一直在试图弄清楚为什么我的视图没有更新。这是为了我。非常感谢分享!在过去的两天里,我一直在想为什么我的视图没有更新