【问题标题】:Button click doesn't lead to Listview to update it's value按钮单击不会导致 Listview 更新其值
【发布时间】:2014-05-02 15:50:54
【问题描述】:

非常简单的情况,但我很困在这里。过去,我曾在编写 MVVM 架构代码的团队中工作过,但这确实是我尝试使用 MVVM 架构编写的第一个小程序。从头开始。

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

代码sn-ps如下:

    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

我的Find() 方法

   public void Find()
    {


        bool inRange;
        Guid fakeUuid = new Guid("{F13F471D-47CB-41d6-9609-BAD0690BF891}"); 
        // A specially created value, so no matches.
        var cli = new BluetoothClient();

        //BluetoothDeviceInfo[] device = cli.DiscoverDevices();
        //_discoverdDevicesList = new ObservableCollection<BluetoothDeviceInfo[]>();
        _discoverdDevicesList = new ObservableCollection<BluetoothDeviceInfo>(cli.DiscoverDevices());
       .
       .
       .
     }

还有我的 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 的构造函数中,我可以看到设备列表。但是,当我按照我希望程序工作的方式进行操作时,按下按钮时,使用断点我可以看到我的 `_discoverdDevicesList' 正在更新并填充了值,但这并不能让它成为列表视图的方式,因为它应该。似乎绑定没有感觉到这个变量发生的变化。

如果你能帮我解决一下就好了。

干杯

【问题讨论】:

  • 您是否尝试过调用 Clear(),然后调用 Add(),而不是将您的集合重新分配给新实例?
  • 好吧,我从cli.DiscoverDevices() 的输出中将结果作为一个整体列表,然后我更愿意将整个结果分配给我的_discoverdDevicesList。可能一个 LINQ 语句可以在一个简单的语句中将它的所有成员分配给我的变量,而不是循环遍历。但我的问题是,我的绑定怎么感觉不到 _discoverdDevicesList 发生的变化?
  • 我想知道 listview 是否只是在观察原始的 ObservableCollection 实例并且没有注意到属性是否被完全重新分配。
  • 我怎么能确定呢?您是否需要代码的其他 sn-p 以获取更多信息?或者我可以自己检查的东西?
  • 我猜你可以在Find() 方法中调用ObservableCollection 构造函数之后调用OnPropertyChanged("DiscoveredDevicesList");。这是必要的,因为您更新了私有变量并且没有人通知 WPF 绑定引擎公共属性已更改。

标签: c# listview mvvm binding


【解决方案1】:

而不是

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

你应该这样做

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

否则 OnPropertyChanged() 不会被触发。

最好只初始化一次你的集合,然后使用 clear、add、remove 来改变它。

 DiscoveredDevicesList.Clear()
 foreach(var item in cli.DiscoverDevices())
    DiscoveredDevicesList.Add(item);

【讨论】:

  • 太棒了。我昨晚在使用按钮而不是列表视图时发现了这一点。出于某种原因,我认为应该在 Binding 方法中更新虚拟变量。非常感谢您的回复。
  • 我对此有一些额外的问题。在我初始化我的收藏后,我采纳了您的建议并使用了AddClear,并且效果很好。但是,现在我正在从 ListView 中的一个条目更新一个字段,并且我得到了所有绑定并使用了正确的变量 DisveredDevicesList 但我的列表视图没有跟随更改并且不会更新自己.有什么我在这里想念的吗。代码与上面完全相同,我正在考虑的唯一更改是按照您的建议使用正确的变量。我需要采取更多的行动来实现它吗?
  • 这是我为测试目的而在按钮单击中添加的内容DiscoveredDevicesList[0].GpsSignal = false;,当我单击按钮但尝试使用@987654329 添加另一个条目时,更改不会显示@
  • 如果您编辑集合中的项目,您的对象应该实现 INotifyPropertyChanged。然后您会在您的视图中看到更改(当然是正确的绑定:) 在您的情况下,BluetoothDeviceInfo 需要实现并引发 INotifyPropertyChanged。如果它不起作用,只需创建一个新问题
  • 如你所问,我在一个新问题的正文中更新了它。这是我将其放入“Listview 绑定不更新视图”中的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多