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 => False
GelSight.Mobile.App: 21:28:53.273 [10] DEBUG - ThreadProc: Live
thread
proc stopping
GelSight.Mobile.App: 21:28:53.478 [1] DEBUG - .ctor: Added custom place F:\Remote
GelSight.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:\Remote
System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored
for
items already of the ItemsControl's container type RadWatermarkTextBox
System.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?