Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF ObservableCollection未更新视图_C#_Wpf_Observablecollection - Fatal编程技术网

C# WPF ObservableCollection未更新视图

C# WPF ObservableCollection未更新视图,c#,wpf,observablecollection,C#,Wpf,Observablecollection,这是xaml部分 <ItemsControl x:Name="EventsTop"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Margin="0,1,0,0"> <Bu

这是xaml部分

<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="&#xf08d;" 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。在这种情况下,集合永远不会重新设置。谢谢!这是为了我。非常感谢分享!在过去的两天里,我一直在试图弄清楚为什么我的视图没有更新。这是为了我。非常感谢分享!在过去的两天里,我一直在想为什么我的视图没有更新