C# 按钮点击不';t引导Listview更新它';s值
情况很简单,但我被困在这里了。在过去,我曾在编写MVVM体系结构代码的团队中工作过,但这是我尝试使用MVVM arch编写的第一个小程序。从头开始 我有一个按钮,可以启动一个名为C# 按钮点击不';t引导Listview更新它';s值,c#,listview,mvvm,binding,C#,Listview,Mvvm,Binding,情况很简单,但我被困在这里了。在过去,我曾在编写MVVM体系结构代码的团队中工作过,但这是我尝试使用MVVM arch编写的第一个小程序。从头开始 我有一个按钮,可以启动一个名为Find()的方法。这部分很好用。 我还为Listview设置了一个绑定,以读取Find()方法将要更改的数据 代码片段如下所示: public ICommand FindBlueToothCommand { get { if (_findBlueT
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=false当我单击按钮时,更改不会显示,但当我尝试使用add()
添加另一个条目时,如果编辑集合中的项目,则对象应实现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);