I'm trying to build a generic Command
that can access properties from my ViewModel
. On my Window are several TextBoxes
, each TextBox
has a Button
next to it. When the Button
is clicked I show an OpenFileDialog
and set the Text
of the TextBox
to the selected files path. The TextBox
itself has a Binding
to a property in the ViewModel
. Currently this is implemented with a Command
in the ViewModel
. The Buttons
all call the same Command
but each Button
has a its property CommandParameter
set to the TextBox
that will receive the filepath. The drawback of this is, that I need to cast the parameter from the Command
execution to a TextBox
and then set its Text
property. My question is now, if I can't somehow bind my 'Command' to the same property the TextBox
is bound to. Here is what I currently do:
XAML
<TextBox Text="{Binding SettingsPath}" x:Name="txtSettingsPath"></TextBox>
<Button Command="{Binding OpenFile}"
CommandParameter="{Binding ElementName=txtSettingsPath}">...</Button>
C#
public ICommand OpenFile
{
get
{
bool CanExecuteOpenFileCommand()
{
return true;
}
CommandHandler GetOpenFileCommand()
{
return new CommandHandler((o) =>
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = false;
if (!string.IsNullOrEmpty(SettingsPath) && File.Exists(settingsPath))
{
ofd.InitialDirectory = Path.GetDirectoryName(SettingsPath);
}
if(ofd.ShowDialog() == true)
{
if(o is TextBox txt)
{
txt.Text = ofd.FileName;
}
}
}, CanExecuteOpenFileCommand);
}
return GetOpenFileCommand();
}
}
In the XAML I would like to have something like this:
<TextBox Text="{Binding SettingsPath}"></TextBox>
<Button Command="{Binding OpenFile}"
CommandParameter="{Binding SettingsPath}">...</Button>