Hello,
I want to set a custom user control as an entry for some properties (full MVVM support). If the user clicks the button a custom file selector (modal) should be shown. If the user selects a file, the file path should be shown in the textfield and also should be bind to the changed property in the propertygrid.
UserControl: A grid with a textfield and a button
<
UserControl
x:Class
=
"EN.Editor.UI.ImageSelector"
xmlns:local
=
"clr-namespace:EN.Editor.UI"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable
=
"d"
Width
=
"100"
>
<
Grid
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
Width
=
"*"
></
ColumnDefinition
>
<
ColumnDefinition
Width
=
"30"
></
ColumnDefinition
>
</
Grid.ColumnDefinitions
>
<
TextBox
Grid.Column
=
"0"
Name
=
"txtPath"
Text
=
"{Binding ImagePath, Mode=TwoWay}"
/>
<
Button
Grid.Column
=
"1"
Command
=
"{Binding SelectFileCommand}"
CommandParameter
=
"{Binding}"
Content
=
"..."
/>
</
Grid
>
</
UserControl
>
ViewModel of the User Control (set as DataContext in Code behind)
public
class
ImageSelectorViewModel : ViewModelBase
{
private
string
imagePath;
public
DelegateCommand SelectFileCommand {
get
;
private
set
;}
public
ImageSelectorViewModel()
{
this
.SelectFileCommand =
new
DelegateCommand(x => SelectFile());
}
public
string
ImagePath
{
get
{
return
imagePath; }
set
{
if
(
this
.imagePath != value)
{
imagePath = value;
OnPropertyChanged(() => ImagePath);
}
}
}
private
void
SelectFile()
{
FileSelector fs =
new
FileSelector(
"Choose file"
);
if
(fs.ShowDialog() == CommonFileDialogResult.Ok)
{
this
.ImagePath = fs.FileName;
}
}
}
I set the user control as a custom editor attribute on the autogenerated item of my property grid
[Display(AutoGenerateField =
true
, Name =
"Video Transition"
)]
[Telerik.Windows.Controls.Data.PropertyGrid.Editor(
typeof
(ImageSelector), EditorStyle.None)]
public
string
NavigateToMovie
{
get
{
return
this
.navigateToMovie;
}
set
{
if
(
this
.navigateToMovie != value)
{
this
.navigateToMovie = value;
this
.OnPropertyChanged(() => NavigateToMovie);
}
}
}
I've tried many different ways, but the click command isn't triggered. If I replace the click command on the button with a Click event handler the file selector is shown, but the selected file path isn't set on the property in the property grid. I've also tried to set the targetProperty Attribute to "ImagePath" but also without success.
For better code separation I need the full MVVM style.
I've spent lot of hours to get this done - without success.
What's wrong with my code? Thanks.