Добрый день!
Подскажите, плз, как можно забиндить параметр команды к вычисляемому свойству (в примере — возвращающему TextBox.Text+"!")?
В параметр у меня, в итоге, передается значение null, что не есть хорошо.
Причем, если биндить напрямую к свойству Text текст-бокса, при выполнении команды в параметр будет идти реально введенный текст.
Возможно, стоит использовать DependecyProperty, однако, у меня результат получается тот же
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.CommandBindings.Add(
new CommandBinding(Commands.Commands.Execute, ExecuteCmdExecuted, ExecuteCmdCanExecute));
}
void ExecuteCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
String command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)target).Name;
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj + "\n" +
(e.Parameter != null ? e.Parameter.ToString() : "<null>"));
}
void ExecuteCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = !String.IsNullOrEmpty(this.tbName.Text);
}
public string ParameterValue
{
get
{
return this.tbName.Text + "!";
}
}
XAML:
<Window x:Class="CommandParameterTestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Commands="clr-namespace:CommandParameterTestApp.Commands"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" Name="mainWindow">
<Grid>
<TextBox Height="23" Name="tbName" Width="120" />
<Button Content="Button" Height="23" Name="btnExecuteCommand" Width="75"
Command="Commands:Commands.Execute" CommandParameter="{Binding ElementName=mainWindow, Path=ParameterValue}" Margin="212,173,216,115" />
</Grid>
</Window>
Заранее спасибо.
На момент срабатывания команды CommandParameter имеет начальное значение свойства ParameterValue. Вижу решение путем перемещения привязки со свойства ParameterValue на this.tbName.Text таким образом:
<Button Content="Button" Height="23" Name="btnExecuteCommand" Width="75" Command="Commands:Commands.Execute" CommandParameter="{Binding ElementName=tbName, Path=Text, StringFormat="{}{0}!"}" Margin="212,173,216,115" />
Здравствуйте, alex_ozr, Вы писали:
_> Спасибо,это все я понимаю. Пример дан мной в упрощенном виде — на самом деле свойство возвращает экземпляр одного класса, создаваемый на основе других данных.
_> Так вот, хотел бы узнать,существуют ли какие-либо простые сценарии/способы реализации, с учетом возможностей WPF, передачи объектов через параметры посредством биндинга?
_> Дело в том, что на основной форме динамически создаются разные контролы, у которых возможен вызов одной и той же команды, в параметр которой должен передаваться объект, вычисляемый в зависимости от того, какие данные в контроле введены.
Так сценарий правильный. Пишем Binding в CommandParameter и видим значение в обработчике команды. Проблема данного примера может заключаться в том, что класс не
оповещает об изменении ParameterValue. Поэтому Binding не обновляется и всегда содержит начальное значение, как и написал
3epo4Автор: 3epo4
Дата: 03.10.10
.