2017-01-23 75 views
0

我正在研究一個新的UWP應用程序,它通過藍牙與某些硬件進行交互。使用windows-universal-samples repo作爲指導,我能夠成功地獲得我想要的工作。如何在Prism(MVVM)中使用Windows.Devices.Enumeration.DevicePicker?

現在我試圖將我在點擊事件處理程序中編寫的代碼重構爲使用Prism的視圖模型類。但是我不知道如何解決這個問題。在我需要在View和ViewModel之間傳遞數據的其他場景中,我將在ViewModel上創建一個屬性,並將其綁定到視圖的XAML中的控件。

問題是Windows.Devices.Enumaration.DevicePicker的使用方式與MVVM模式不兼容。在點擊處理程序中,數據和控件合併在一起,我看不到如何在視圖模型上創建某種列表屬性,然後將其綁定到視圖。這裏是我一起工作的代碼的最簡單的例子:

async void DiscoverButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    var devicePicker = new DevicePicker(); 
    devicePicker.Filter.SupportedDeviceSelectors.Add(BluetoothLEDevice.GetDeviceSelectorFromPairingState(true)); 

    // Calculate the position to show the picker (right below the buttons) 
    var ge = DiscoverButton.TransformToVisual(null); 
    var point = ge.TransformPoint(new Point()); 
    var rect = new Rect(point, new Point(100, 100)); 
    var device = await devicePicker.PickSingleDeviceAsync(rect); 

    var bluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(device.Id); 
} 

PickSingleDeviceAsync()直接創建一個控制。

+0

你解決了你的問題嗎?如果您對此問題有任何其他疑慮,請隨時通知我。 –

回答

0

我想出瞭解決的辦法是放棄建於由DevicePicker提供的UI,而是創建自己的UI與DeviceWatcher使用。例如:

void StartWatcher() 
{ 
    ResultCollection.Clear(); 

    string selector = BluetoothLEDevice.GetDeviceSelector(); 

    DeviceWatcher = DeviceInformation.CreateWatcher(selector); 

    DeviceWatcher.Added += async (deviceWatcher, deviceInformation) => 
    { 
     await OnUiThread(() => 
     { 
      ResultCollection.Add(deviceInformation); 
     }); 
    }; 

    DeviceWatcher.Start(); 
} 

其中ResultCollection將從視圖模型綁定到視圖。

1

現在我正在嘗試將我在點擊事件處理程序中編寫的代碼重構爲使用Prism的視圖模型類。但是我不知道如何解決這個問題。

您可以爲您的按鈕綁定命令並使用CommandParameter將參數傳遞給該命令。

請參考下面的代碼示例的詳細信息:

<Button x:Name="btn" Content="device" Command="{Binding ClickCommand}" CommandParameter="{Binding ElementName=btn}"></Button> 
public class MianViewModel : BindableBase 
{ 
    public ICommand ClickCommand 
    { 
     get; 
     private set; 
    } 

    public MianViewModel() 
    { 
     ClickCommand = new DelegateCommand<object>(ClickedMethod); 
    } 

    private async void ClickedMethod(object obj) 
    { 
     var devicePicker = new DevicePicker(); 
     devicePicker.Filter.SupportedDeviceSelectors.Add(BluetoothLEDevice.GetDeviceSelectorFromPairingState(true)); 

     // Calculate the position to show the picker (right below the buttons) 
     Button DiscoverButton = obj as Button; 
     if (DiscoverButton != null) 
     { 
      var ge = DiscoverButton.TransformToVisual(null); 
      var point = ge.TransformPoint(new Point()); 
      var rect = new Rect(point, new Point(100, 100)); 
      var device = await devicePicker.PickSingleDeviceAsync(rect); 

      if (device != null) 
      { 
       var bluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(device.Id); 
      } 
     } 
    } 
}