Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# 替换ObservableCollection时ListView未更新_C#_.net_Wpf - Fatal编程技术网

C# 替换ObservableCollection时ListView未更新

C# 替换ObservableCollection时ListView未更新,c#,.net,wpf,C#,.net,Wpf,我无法理解为什么在ObservableCollection被替换(使用新集合)而没有更改(添加或删除项)时ListView没有刷新。 我尊重属性通知的所有要求,因为我在视图模型中使用DependencyObject,并且在替换集合时调用SetValue 我将WPF ListView绑定到视图模型的Col属性: public class ViewModel1 : DependencyObject { public ViewModel1() { Col = new O

我无法理解为什么在ObservableCollection被替换(使用新集合)而没有更改(添加或删除项)时ListView没有刷新。 我尊重属性通知的所有要求,因为我在视图模型中使用DependencyObject,并且在替换集合时调用SetValue

我将WPF ListView绑定到视图模型的Col属性:

public class ViewModel1 : DependencyObject
{
    public ViewModel1()
    {
        Col = new ObservableCollection<string>(new[] { "A", "B", "C", "D" });
    }

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnPropertyChanged(e);
        Debug.WriteLine("Property changed "+ e.Property.Name);
    }   

    public ObservableCollection<string> Col
    {
        get { return (ObservableCollection<string>)GetValue(ColProperty); }
        set { SetValue(ColProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ColProperty =
        DependencyProperty.Register("ColProperty", typeof(ObservableCollection<string>), typeof(ViewModel1), new PropertyMetadata(null));

}
公共类ViewModel1:DependencyObject { 公共视图模型1() { Col=新的可观察集合(新[]{“A”、“B”、“C”、“D”}); } 受保护的重写无效OnPropertyChanged(DependencyPropertyChangedEventArgs e) { 根据改变的财产(e); Debug.WriteLine(“属性已更改”+e.Property.Name); } 公共可观测集合 { get{return(ObservableCollection)GetValue(ColProperty);} set{SetValue(ColProperty,value);} } //使用DependencyProperty作为MyProperty的备份存储。这将启用动画、样式设置、绑定等。。。 公共静态只读DependencyProperty ColProperty= DependencyProperty.Register(“ColProperty”、typeof(ObservableCollection)、typeof(ViewModel1)、new PropertyMetadata(null)); } XAML类似于:

<Window x:Class="BindingPOC.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <ListView Margin="0,10,0,0" ItemsSource="{Binding Col}" />
            <Button Click="Button_Click" >click</Button>
        </StackPanel>

    </Grid>
</Window>

点击
因此,有了这段代码,如果我不替换初始的ObservableCollection,一切都可以正常工作。 但当我点击按钮时。我将清单改为:

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            (DataContext as ViewModel1).Col = new System.Collections.ObjectModel.ObservableCollection<string>(new[] { "Z", "ZZ" });

        }
private void按钮\u单击(对象发送者,路由目标)
{
(DataContext作为ViewModel1.Col=new System.Collections.ObjectModel.ObservableCollection(new[]{“Z”,“ZZ”});
}
为Col调用视图模型上的PropertyChanged方法,但ListView未更新其内容


我是否需要保存相同的ObservableCollection引用?为什么?

这是因为您的依赖项属性注册不正确。传递给
寄存器的属性的名称应为“Col”,而不是“ColProperty”:

public静态只读从属属性ColProperty=
DependencyProperty.Register(“Col”、typeof(ObservableCollection)、typeof(ViewModel1)、new PropertyMetadata(null));
初始绑定可以工作,因为有一个名为
Col
的属性,但它没有被检测为依赖属性,因此绑定不会自动更新

public static readonly DependencyProperty ColProperty =
    DependencyProperty.Register("Col", typeof(ObservableCollection<string>), typeof(ViewModel1), new PropertyMetadata(null));