【发布时间】:2017-06-28 14:38:37
【问题描述】:
我正在尝试构建一个通用的Command,它可以从我的ViewModel 访问属性。在我的窗口上有几个TextBoxes,每个TextBox旁边都有一个Button。单击Button 时,我显示OpenFileDialog 并将TextBox 的Text 设置为选定的文件路径。 TextBox本身具有Binding 到ViewModel 中的属性。目前这是通过ViewModel 中的Command 实现的。 Buttons 都调用相同的Command,但每个Button 都有一个属性CommandParameter 设置为TextBox,它将接收文件路径。这样做的缺点是,我需要将参数从Commandexecution 转换为TextBox,然后设置它的Textproperty。我现在的问题是,如果我不能以某种方式将我的“命令”绑定到 TextBox 绑定到的同一属性。这是我目前所做的:
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();
}
}
在 XAML 中我想要这样的东西:
<TextBox Text="{Binding SettingsPath}"></TextBox>
<Button Command="{Binding OpenFile}"
CommandParameter="{Binding SettingsPath}">...</Button>
【问题讨论】:
-
你能不能不用你贴的XAML,然后就做o = ofd.FileName ?
-
你想要的是一个小的视图模型,叫它
SettingsPathSelectorViewModel,它有一个Path属性和一个OpenFile命令。然后,您将编写一个看起来像您最后一个 XAML sn-p 的 DataTemplate 来显示它。然后你可以让你的主视图模型暴露几个SettingsPathSelectorViewModels -
@Milney 不幸的是没有。
o在这种情况下只是字符串,而不是对属性的引用。 -
@EdPlunkett 我不确定我是否理解正确。如何显示控件?你能提供一个小样本吗?
-
@RomanoZumbé 努力工作
标签: c# wpf xaml mvvm data-binding