private async void SaveButton_Click(object sender, RoutedEventArgs e)
        {
            var saveFileDialog = new SaveFileDialog
            {
                Filter = "MFI Mapping (*.mfimapping)|*.mfimapping"
            };

            if (saveFileDialog.ShowDialog() == true)
            {
                try
                {
                    using (var outputFile = new StreamWriter(saveFileDialog.FileName))
                    {
                        URLLabel.Content = saveFileDialog.FileName;
                        var mappingItems            = MappingItemsListView.Items.SourceCollection.Cast <ListViewItem>().Select(item => item.Content as GamepadMappingItem).ToList();
                        var virtualKeysMappingItems = VirtualKeysItemsListView.Items.SourceCollection.Cast <ListViewItem>().Select(item => item.Content as VirtualKeyMappingItem).ToList();

                        var newMapping = new GamepadMapping(mappingItems, virtualKeysMappingItems);

                        await outputFile.WriteAsync(JsonConvert.SerializeObject(newMapping, Formatting.Indented));
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
        private void NewButton_Click(object sender, RoutedEventArgs e)
        {
            var newMapping = new GamepadMapping(new List <GamepadMappingItem>(), new List <VirtualKeyMappingItem>());

            SaveButton_Click(null, null);
            BindMappingToUi(newMapping);
        }
        private static async Task SaveConfigurationToFile(GamepadMapping configuration, string filename)
        {
            var desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            using (var outputFile = new StreamWriter(desktopPath + $"\\{filename}.mfimapping"))
            {
                await outputFile.WriteAsync(JsonConvert.SerializeObject(configuration, Formatting.Indented));
            }
        }
        private void BindMappingToUi(GamepadMapping mapping)
        {
            ListViewMappingItems = new ReactiveCollection <ListViewItem>();
            foreach (var mappingItem in mapping.MappingItems)
            {
                var item = new ListViewItem
                {
                    Content         = mappingItem,
                    ContentTemplate = DataTemplateForMappingType(mappingItem.Type)
                };

                ListViewMappingItems.Add(item);
            }

            MappingItemsListView.ItemsSource      = ListViewMappingItems;
            MappingItemsListView.AlternationCount = ListViewMappingItems.Count + 1;


            VirtualKeysListViewMappingItems = new ReactiveCollection <ListViewItem>();
            foreach (var virtualKeyMappingItem in mapping.VirtualKeysItems)
            {
                var item = new ListViewItem
                {
                    Content         = virtualKeyMappingItem,
                    ContentTemplate = (DataTemplate)FindResource("VirtualKeysItemTemplate")
                };

                VirtualKeysListViewMappingItems.Add(item);
            }

            VirtualKeysItemsListView.ItemsSource = VirtualKeysListViewMappingItems;

            SaveButton.IsEnabled             = true;
            AddNewItemButton.IsEnabled       = true;
            AddNewVirtualKeyButton.IsEnabled = true;
        }