C# 按钮点击不';t引导Listview更新它';s值

C# 按钮点击不';t引导Listview更新它';s值,c#,listview,mvvm,binding,C#,Listview,Mvvm,Binding,情况很简单,但我被困在这里了。在过去,我曾在编写MVVM体系结构代码的团队中工作过,但这是我尝试使用MVVM arch编写的第一个小程序。从头开始 我有一个按钮,可以启动一个名为Find()的方法。这部分很好用。 我还为Listview设置了一个绑定,以读取Find()方法将要更改的数据 代码片段如下所示: public ICommand FindBlueToothCommand { get { if (_findBlueT

情况很简单,但我被困在这里了。在过去,我曾在编写MVVM体系结构代码的团队中工作过,但这是我尝试使用MVVM arch编写的第一个小程序。从头开始

我有一个按钮,可以启动一个名为
Find()
的方法。这部分很好用。 我还为Listview设置了一个绑定,以读取
Find()
方法将要更改的数据

代码片段如下所示:

    public ICommand FindBlueToothCommand
    {
        get
        {
            if (_findBlueToothCommand == null)
            {
                _findBlueToothCommand = new RelayCommand(param => Find());
            }
            return _findBlueToothCommand;
        }
    }

    public ObservableCollection<BluetoothDeviceInfo> DiscoveredDevicesList
    {
        get
        {
            return this._discoverdDevicesList;
        }
        set
        {
            this._discoverdDevicesList = value;
            base.OnPropertyChanged("DiscoveredDevicesList");
        }

    }

    private ObservableCollection<BluetoothDeviceInfo> _discoverdDevicesList;

    #endregion //Presentation Properties
还有我的XAML代码

<Window x:Class="BlueTooth_Tester_MVVM.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Blue Tooth Tester v1.0" Height="350" Width="525">
<Window.Resources>
    <CollectionViewSource
        x:Key="DeviceList"
        Source="{Binding Path=DiscoveredDevicesList}">

    </CollectionViewSource>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="250"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
    </Grid.RowDefinitions>
    <ListView 
        Grid.Row="0" 
        DataContext="{StaticResource DeviceList}"
        ItemsSource="{Binding}">            
    </ListView>
    <Button Grid.Row="1" Content="Button" Command="{Binding Path=FindBlueToothCommand}" HorizontalAlignment="Right" VerticalAlignment="Top" Width="75" Margin="5"/>

</Grid>

在此过程中,如果我将
Find()
放在ViewModel的构造函数中,我可以看到设备列表。然而,当我按照我希望的方式运行程序时,当按下按钮时,使用断点,我可以看到我的“\u DiscoverdDeviceList”正在更新并填充了值,但这并没有使它以应有的方式进入listview。绑定似乎感觉不到此变量发生的更改

如果你能帮我一把就好了

干杯

而不是

_discoverdDevicesList = new ObservableCollection<BluetoothDeviceInfo>(cli.DiscoverDevices());

没有将集合重新分配给新实例,而是尝试调用Clear()和Add()?我从
cli.DiscoverDevices()
的输出中得到一个完整的列表,然后我更愿意将整个结果分配给我的_discoverdeviceslist。也许一个LINQ语句可以在一个简单的句子中将它的所有成员分配给我的变量,而不是循环。但是我的问题是,为什么我的绑定没有感觉到发生在_discoverdDeviceList上的更改?我想知道listview是否只监视原始的ObservableCollection实例,而没有注意到属性是否被完全重新分配。我如何确保这一点?您是否需要其他代码片段来获取额外信息?或者我可以自己检查的东西?我想你可以调用
OnPropertyChanged(“discoveredDeviceList”)Find()
方法中的
observateCollection
构造函数后,执行code>。这是必要的,因为您更新了私有变量,并且没有人通知WPF绑定引擎公共属性已更改。太棒了。昨天晚上,当我使用按钮而不是列表视图时,我发现了这一点。出于某种原因,我认为应该在Binding方法中更新虚拟变量。谢谢你的回复。我还有一些问题要问。我接受了您的建议,在初始化我的收藏并运行后,使用了
Add
Clear
。但是,现在我正在从
ListView
中的一个条目更新一个字段,并且我得到了所有的绑定,并使用了正确的变量
disveredeviceslist
,但是我的列表视图没有跟随更改,也没有更新自己。这里有我遗漏的东西吗。代码与上面的代码完全相同,我正在考虑的唯一更改是按照您的建议使用正确的变量。我是否需要进行更多的更改才能实现它?这是我在按钮中所做的更改,用于测试目的
discoveredDeviceList[0]。GpsSignal=falseadd()
添加另一个条目时,如果编辑集合中的项目,则对象应实现INotifyPropertyChanged。然后,您会看到视图中的更改(当然是使用正确的绑定:)在您的案例中,BluetoothDeviceInfo需要实现并引发INotifyPropertyChanged。如果它不起作用,就创建一个新问题。正如你问的,我在一个新问题的主体中更新了它。这就是我在“Listview绑定不更新视图”中提出的问题
_discoverdDevicesList = new ObservableCollection<BluetoothDeviceInfo>(cli.DiscoverDevices());
  DiscoveredDevicesList= new ObservableCollection<BluetoothDeviceInfo>(cli.DiscoverDevices());
 DiscoveredDevicesList.Clear()
 foreach(var item in cli.DiscoverDevices())
    DiscoveredDevicesList.Add(item);