2013-04-11 2 views
14

Как я могу отправить несколько параметров из Button в WPF? Я могу отправить единственный параметр, который соответствует значению TextBox. Вот код.Несколько параметров команды wpf button object

XAML

<TextBox Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="133,22,0,0"  Name="textBox1" VerticalAlignment="Top" Width="120" /> 
<Button Content="Button" Grid.Row="1" Height="23" Command="{Binding Path=CommandClick}" CommandParameter="{Binding Text,ElementName=textBox1}" HorizontalAlignment="Left" Margin="133,62,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 

Code behind

public ICommand CommandClick { get; set; } 

this.CommandClick = new DelegateCommand<object>(AddAccount); 

private void AddAccount(object obj) 
{ 
    //custom logic 
} 
+0

Если вы опишете, какие именно параметры вы хотите, их типы и почему, мы могли бы помочь. Существует только одно «привязка» к параметру команды, но есть другие варианты в зависимости от того, что вам нужно, поэтому более подробную информацию. –

+0

Вы можете преобразовать многие параметры в один, используя объект [] (массив объектов), например, но тогда вам нужно будет отбросить все эти параметры вовнутрь. Или есть проблема с этим? – Master117

+0

привет J King, это будет другой контроль. текстовое поле может быть хорошим предположением. –

ответ

14

Как я могу отправить несколько параметров из кнопки в WPF.

Вы можете отправить только один параметр как CommandParameter.

Лучшее решение, как правило, просто привязать TextBox и другие элементы управления к нескольким свойствам в ViewModel. Затем команда будет иметь доступ ко всем этим свойствам (поскольку она находится в том же классе), без необходимости использовать параметр команды.

24

Помимо использования подхода определения свойств в вашем классе (назовем его вашей ViewModel), который будет привязан вашим представлением, бывают случаи (не общие), в которых мы не хотим этого делать, важно Инструмент, который нужно знать в этих ситуациях, - это MultiBinding, поэтому просто ради полноты, хотя вы удовлетворены первым вариантом, я рассмотрю другой подход.

так, чтобы ответить на ваш вопрос:

1. MVVM подход:

Используйте подход MVVM и определить свойство переплетены по вашему мнению, и использовать эти свойства в команде вашей ViewModel без необходимости CommandParameters.

2. MultiBinding:(может жить счастливо с MVVM подходом)

Передача команды параметра в качестве параметра несколько переплетено, как показано здесь:

<Button Content="MultiBindingExample" Command="{Binding MyCommand}"> 
    <Button.CommandParameter> 
     <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
      <Binding Path="..." ElementName="MyTextBox"/> 
      <Binding Path="..." ElementName="MySomethingElse"/> 
     </MultiBinding> 
    </Button.CommandParameter> 
</Button> 

С вашим конвертером Defined с помощью IMultiValueConverter Интерфейс:

public class MyMultiConverter: IMultiValueConverter 
{ 
    public object Convert(object[] values, ...) 
    { 
     return values.Clone(); 
    } 
} 

и для извлечения значений: Просто обратитесь к параметру в вашей команде как Object[] и используйте параметры в том же порядке, что и в MultiBinding.

+2

ваш преобразователь возвращает правильные значения, но в методе, присоединенном к команде relay, возвращается массив, но элементы массива имеют значение NULL. –

+0

Правильно ли вы определили статический ресурс? см. http://msdn.microsoft.com/en-us/library/windows/apps/hh758287.aspx для получения дополнительной информации, сосредоточьтесь на примере стековой панели, где вы можете увидеть, как определить статический ресурс. –

+0

Я столкнулся с той же проблемой, все идеально, за исключением значений null. – Amit