diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml b/samples/ControlCatalog/Pages/DialogsPage.xaml
index 75d98827c1..7320c1f3d7 100644
--- a/samples/ControlCatalog/Pages/DialogsPage.xaml
+++ b/samples/ControlCatalog/Pages/DialogsPage.xaml
@@ -31,6 +31,12 @@
TXT mime only
TXT apple type id only
+
+ Use SuggestedFileType
+
+ First filter
+
+
Force managed dialog
diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
index d755a1b14d..0e2ad7d2b9 100644
--- a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
@@ -37,6 +37,8 @@ namespace ControlCatalog.Pages
var openedFileContent = OpenedFileContent;
var openMultiple = OpenMultiple;
var currentFolderBox = CurrentFolderBox;
+ var useSuggestedFilter = UseSuggestedFilter;
+ var suggestedFilterSelector = SuggestedFilterSelector;
currentFolderBox.TextChanged += async (sender, args) =>
{
@@ -76,7 +78,7 @@ namespace ControlCatalog.Pages
}).ToList() ?? new List();
}
- List? GetFileTypes()
+ List? BuildFileTypes()
{
var selectedItem = (FilterSelector.SelectedItem as ComboBoxItem)?.Content
?? "None";
@@ -115,6 +117,64 @@ namespace ControlCatalog.Pages
};
}
+ List? GetFileTypes()
+ {
+ var types = BuildFileTypes();
+ UpdateSuggestedFilterSelector(types);
+ return types;
+ }
+
+ void UpdateSuggestedFilterSelector(IReadOnlyList? types)
+ {
+ var previouslySelected = (suggestedFilterSelector.SelectedItem as ComboBoxItem)?.Tag as FilePickerFileType;
+ suggestedFilterSelector.Items.Clear();
+ suggestedFilterSelector.Items.Add(new ComboBoxItem { Content = "First filter", Tag = null });
+
+ var desiredIndex = 0;
+ if (types is { Count: > 0 })
+ {
+ for (var i = 0; i < types.Count; i++)
+ {
+ var type = types[i];
+ var item = new ComboBoxItem { Content = type.Name, Tag = type };
+ suggestedFilterSelector.Items.Add(item);
+
+ if (previouslySelected is not null && ReferenceEquals(previouslySelected, type))
+ {
+ desiredIndex = i + 1;
+ }
+ }
+ }
+
+ suggestedFilterSelector.SelectedIndex = desiredIndex;
+ }
+
+ FilePickerFileType? GetSuggestedFileType(IReadOnlyList? types)
+ {
+ if (useSuggestedFilter.IsChecked == true && types is { Count: > 0 })
+ {
+ if (suggestedFilterSelector.SelectedItem is ComboBoxItem { Tag: FilePickerFileType selectedType }
+ && types.Any(t => ReferenceEquals(t, selectedType)))
+ {
+ return selectedType;
+ }
+
+ return types.FirstOrDefault();
+ }
+
+ return null;
+ }
+
+ void UpdateSuggestedFilterSelectorState() =>
+ suggestedFilterSelector.IsEnabled = useSuggestedFilter.IsChecked == true;
+
+ useSuggestedFilter.Checked += (_, _) => UpdateSuggestedFilterSelectorState();
+ useSuggestedFilter.Unchecked += (_, _) => UpdateSuggestedFilterSelectorState();
+ UpdateSuggestedFilterSelectorState();
+
+ FilterSelector.SelectionChanged += (_, _) => UpdateSuggestedFilterSelector(BuildFileTypes());
+ UpdateSuggestedFilterSelector(BuildFileTypes());
+
OpenFile.Click += async delegate
{
// Almost guaranteed to exist
@@ -229,10 +289,12 @@ namespace ControlCatalog.Pages
OpenFilePicker.Click += async delegate
{
+ var fileTypes = GetFileTypes();
var result = await GetStorageProvider().OpenFilePickerAsync(new FilePickerOpenOptions()
{
Title = "Open file",
- FileTypeFilter = GetFileTypes(),
+ FileTypeFilter = fileTypes,
+ SuggestedFileType = GetSuggestedFileType(fileTypes),
SuggestedFileName = "FileName",
SuggestedStartLocation = lastSelectedDirectory,
AllowMultiple = openMultiple.IsChecked == true
@@ -243,10 +305,12 @@ namespace ControlCatalog.Pages
SaveFilePicker.Click += async delegate
{
var fileTypes = GetFileTypes();
+ var suggestedType = GetSuggestedFileType(fileTypes);
var file = await GetStorageProvider().SaveFilePickerAsync(new FilePickerSaveOptions()
{
Title = "Save file",
FileTypeChoices = fileTypes,
+ SuggestedFileType = suggestedType,
SuggestedStartLocation = lastSelectedDirectory,
SuggestedFileName = "FileName",
ShowOverwritePrompt = true
@@ -278,10 +342,12 @@ namespace ControlCatalog.Pages
};
SaveFilePickerWithResult.Click += async delegate
{
+ var saveFileTypes = new[] { FilePickerFileTypes.Json, FilePickerFileTypes.Xml };
var result = await GetStorageProvider().SaveFilePickerWithResultAsync(new FilePickerSaveOptions()
{
Title = "Save file",
- FileTypeChoices = [FilePickerFileTypes.Json, FilePickerFileTypes.Xml],
+ FileTypeChoices = saveFileTypes,
+ SuggestedFileType = GetSuggestedFileType(saveFileTypes),
SuggestedStartLocation = lastSelectedDirectory,
SuggestedFileName = "FileName",
ShowOverwritePrompt = true
diff --git a/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs b/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs
index 5084d8e822..c60b5f7053 100644
--- a/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs
+++ b/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs
@@ -13,17 +13,26 @@ namespace Avalonia.Data.Converters
/// The output type.
public class FuncMultiValueConverter : IMultiValueConverter
{
- private readonly Func, TOut> _convert;
+ private readonly Func, TOut> _convert;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The convert function.
- public FuncMultiValueConverter(Func, TOut> convert)
+ public FuncMultiValueConverter(Func, TOut> convert)
{
_convert = convert;
}
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The convert function.
+ public FuncMultiValueConverter(Func, TOut> convert)
+ : this(new Func, TOut>(convert))
+ {
+ }
+
///
public object? Convert(IList