I'm using RadOpenFolderDialog with the new filters capability to show only my "custom places" on the left side of the dialog; I need to force the user to only be able select from a list of configured folders or children of them. But there is a problem.
When filtering is enabled in this way, the dialog always requires the user to select something inside of the selected custom place. You can't just click the custom place on the left. The "Select Folder" button doesn't enable. You then have to go to the right hand pane and click one of its subfolders before the "Select Folder" button enables.
This is a problem. Some of my custom places don't have subfolders within them so sometimes there is nothing on the right to select.
If I do not have filtering enabled then selecting the custom place does enable the "Select Folder" button.
For example, I ran my code with just one custom place configured. "F:\Remote" I made the filter log which folders it allows and which it denies. I've attached an image (snap18.png) that shows what it looks like when I select that custom place. Nothing enables.
Here is my dialog code. The filter only allows folders that are equal to or subfolders of one of the custom places:
void SelectFolder(List<string> configuredFolders){ var dlg = new Telerik.Windows.Controls.RadOpenFolderDialog { Multiselect = false, Owner = Application.Current.MainWindow, Header = "Select a folder" ShowNetworkLocations = false, }; foreach (var f in configuredFolders) { dlg.CustomPlaces.Add(f); Log.Debug($"Added custom place {f}"); } // Hook up to the DirectoryRequesting event to prevent folders // we don't want to allow dlg.DirectoryRequesting += (sender, args) => { // Get a normalized file path for easy comparison var name = FileUtils.NormalizePath(args.Directory.FullName); // Only allow folders that are not equal to or a child of one of the // configured folders if (!folders.Any(f => FileUtils.IsParentOrEqual(f, name))) { Log.Debug($"DirectoryRequesting: DENY {name}"); args.Cancel = true; } else { Log.Debug($"DirectoryRequesting Allow {name}"); } }; var result = dlg.ShowDialog(); // Do something with the result}
Here is the log output
GelSight.Mobile.App: 21:28:53.241 [1] DEBUG - IsLive: Device IsLive => FalseGelSight.Mobile.App: 21:28:53.273 [10] DEBUG - ThreadProc: Live thread proc stoppingGelSight.Mobile.App: 21:28:53.478 [1] DEBUG - .ctor: Added custom place F:\RemoteGelSight.Mobile.App: 21:28:53.509 [1] DEBUG - .ctor: DirectoryRequesting: DENY C:GelSight.Mobile.App: 21:28:53.538 [1] DEBUG - .ctor: DirectoryRequesting: DENY D:GelSight.Mobile.App: 21:28:53.570 [1] DEBUG - .ctor: DirectoryRequesting: DENY F:GelSight.Mobile.App: 21:28:53.601 [1] DEBUG - .ctor: DirectoryRequesting Allow F:\RemoteSystem.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type RadWatermarkTextBoxSystem.Windows.Data Error: 40 : BindingExpression path error: 'IsSearchActive' property not found on 'object' ''OpenFolderDialogViewModel' (HashCode=251973)'. BindingExpression:Path=IsSearchActive; DataItem='OpenFolderDialogViewModel' (HashCode=251973); target element is 'FileDialogSearchPane' (Name=''); target property is 'IsSearchViewActive' (type 'Boolean')At one point, I even hacked this code to specifically allow the root folder "F:" also just to see what would happen. It did not fix the problem, it just made "F:" appear on the left (where I don't want it).
So is there way to achieve what I want?
