【发布时间】: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 绑定引擎公共属性已更改。