我可以在XAML ICommand中通过引用传递

时间:2015-06-28 14:13:25

标签: c# wpf xaml data-binding pass-by-reference

在此代码中:

        <ListBox 
            x:Name="DataList1"
            xmlns:local="clr-namespace:xaml_binding_commands"
            >
            <ListBox.Resources>
                <local:CommandUp x:Key="CommandUp1"></local:CommandUp>
            </ListBox.Resources>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                    <TextBox
                        Text="{Binding Height,Mode=TwoWay,StringFormat=00\{0:d\}}"
                        InputScope="Number"/>

                    <RepeatButton
                        Content="+"
                        Command="{StaticResource CommandUp1}"
                        CommandParameter="{Binding }"
                        />

                    <TextBox
                        Text="{Binding Weight,Mode=TwoWay}"
                        InputScope="Number"/>

                    <RepeatButton
                        Content="+"
                        Command="{StaticResource CommandUp1}"
                        CommandParameter="{Binding Weight}"
                        />

                    </StackPanel>

                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>

这个

namespace xaml_binding_commands
{
    public class CommandUp : ICommand
    {
        public bool CanExecute(object parameter)
        {
            return true;
        }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        if (parameter is Entry)
        {
            Entry EntryToUp = (Entry)parameter;
            EntryToUp.Height +=1; // no worky, which field to increment?!
        }
        if (parameter is Int32)
        {
            Int32 EntryFieldToUp = (Int32)parameter;
            EntryFieldToUp += 1; // no worky
        }
    }
}

public class Entry : INotifyPropertyChanged
{

    private Int32 _Height;

    public Int32 Height
    {
        get { return _Height; }
        set { _Height = value; PropChange("Height"); }
    }

    private Int32 _Weight;

    public Int32 Weight
    {
        get { return _Weight; }
        set { _Weight = value; PropChange("Weight"); }
    }

    private void PropChange(String PropName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(PropName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

}



public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }

    private ObservableCollection<Entry> _People = new ObservableCollection<Entry>();

    public ObservableCollection<Entry> People
    {
        get { return _People; }
        set { _People = value; }
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        DataList1.ItemsSource = People;
        People.Add( new Entry() { Height=67, Weight=118 } );

    }
}

}

我可以通过引用传递文本框绑定的字段吗?如果我将整个类,一个Entry传递给CommandParameter以便它可以操作和递增,我无法知道哪一组TextBox和Buttons导致了Command.Execute。如果我传递TextBox绑定的相同内容,即单独:Weight,Height,则Command.Execute无法影响输入。通常我会将PassByReference和我的Int32装箱,并且我的通用操作函数可以对by-ref参数进行操作。我可以在XAML中以某种方式执行此操作吗?

1 个答案:

答案 0 :(得分:1)

如果我这样做,我会使用MVVM Light和RelayCommand<string>。这意味着您可以将一个(或多个)参数作为绑定的一部分传递给ICommand

这意味着您可以对附加到按钮的单个事件处理程序进行多次绑定,并且每个绑定可以使用不同的参数来告诉您它来自何处。

更新1

MVVM Light是一个MVVM库,几乎可以兼容所有内容,从标准的WPF到Windows 8.1再到Windows手机。见http://www.mvvmlight.net/。根据NuGet下载统计数据,它可能是最受欢迎的MVVM库,也是我更喜欢的。

有关如何使用CommandParameter使用MVVM指示灯的示例,请参阅MVVM Light RelayCommand Parameters上的最高投票回答。

有关如何将两个或多个参数传递给RelayCommand的示例,请参阅How to Passing multiple parameters RelayCommand?

更新2

只要查看你的代码,我就会使用MVVM。我通常更喜欢使用MVVM代码(这本身就是一个完整的讨论)。如果您将所有数据放在ViewModel中,并使用绑定让您的XAML View更新ViewModel,我认为开发和维护起来会更容易。