[WPF] Как забиндить CommandParameter к свойству?
От: alex_ozr  
Дата: 03.10.10 10:08
Оценка:
Добрый день!

Подскажите, плз, как можно забиндить параметр команды к вычисляемому свойству (в примере — возвращающему 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>


Заранее спасибо.
wpf command commandbinding
Re: [WPF] Как забиндить CommandParameter к свойству?
От: 3epo4 Россия  
Дата: 03.10.10 10:56
Оценка:
На момент срабатывания команды 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" />
Re[2]: [WPF] Как забиндить CommandParameter к свойству?
От: alex_ozr  
Дата: 03.10.10 11:28
Оценка:
Здравствуйте, 3epo4, Вы писали:

3>На момент срабатывания команды CommandParameter имеет начальное значение свойства ParameterValue. Вижу решение путем перемещения привязки со свойства ParameterValue на this.tbName.Text таким образом:


3><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" />



Спасибо,это все я понимаю. Пример дан мной в упрощенном виде — на самом деле свойство возвращает экземпляр одного класса, создаваемый на основе других данных.
Так вот, хотел бы узнать,существуют ли какие-либо простые сценарии/способы реализации, с учетом возможностей WPF, передачи объектов через параметры посредством биндинга?
Дело в том, что на основной форме динамически создаются разные контролы, у которых возможен вызов одной и той же команды, в параметр которой должен передаваться объект, вычисляемый в зависимости от того, какие данные в контроле введены.

Опыта разработки WPF-приложений еще немного, однако идея использовать команды мне очень нравится, по сравнению с подпиской на события,как в WinForms.
Re[3]: [WPF] Как забиндить CommandParameter к свойству?
От: MxMsk Португалия  
Дата: 03.10.10 13:54
Оценка:
Здравствуйте, alex_ozr, Вы писали:

_> Спасибо,это все я понимаю. Пример дан мной в упрощенном виде — на самом деле свойство возвращает экземпляр одного класса, создаваемый на основе других данных.

_> Так вот, хотел бы узнать,существуют ли какие-либо простые сценарии/способы реализации, с учетом возможностей WPF, передачи объектов через параметры посредством биндинга?
_> Дело в том, что на основной форме динамически создаются разные контролы, у которых возможен вызов одной и той же команды, в параметр которой должен передаваться объект, вычисляемый в зависимости от того, какие данные в контроле введены.
Так сценарий правильный. Пишем Binding в CommandParameter и видим значение в обработчике команды. Проблема данного примера может заключаться в том, что класс не оповещает об изменении ParameterValue. Поэтому Binding не обновляется и всегда содержит начальное значение, как и написал 3epo4
Автор: 3epo4
Дата: 03.10.10
.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.