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

C# 我可以在XAML ICommand中通过引用传递吗,c#,wpf,xaml,data-binding,pass-by-reference,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:Comma

在此代码中:

        <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 } );

    }
}
namespace xaml_binding_命令
{
公共类命令:ICommand
{
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件处理程序CanExecuteChanged;
public void Execute(对象参数)
{
if(参数为条目)
{
Entry EntryToUp=(Entry)参数;
EntryToUp.Height+=1;//不工作,增加哪个字段?!
}
if(参数为Int32)
{
Int32 EntryFieldToUp=(Int32)参数;
EntryFieldToUp+=1;//不工作
}
}
}
公共类条目:INotifyPropertyChanged
{
私人Int32_高度;
公共Int32高度
{
获取{return\u Height;}
设置{u Height=value;PropChange(“Height”);}
}
私人Int32_重量;
公共Int32权重
{
获取{return\u Weight;}
设置{u Weight=value;PropChange(“Weight”);}
}
私有void PropChange(字符串PropName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新PropertyChangedEventArgs(PropName));
}
公共事件属性更改事件处理程序属性更改;
}
公共部分类主页:PhoneApplicationPage
{
公共主页()
{
初始化组件();
this.Loaded+=主页面_Loaded;
}
私有ObservableCollection_People=新ObservableCollection();
公众观察收集人
{
获取{return\u People;}
设置{u People=value;}
}
已加载无效主页(对象发送器、路由目标)
{
DataList1.ItemsSource=人;
添加(新条目(){Height=67,Weight=118});
}
}
}


我可以通过引用传递文本框绑定到的字段吗?如果我将整个类(一个条目)传递给CommandParameter,以便它可以操作和递增,那么我无法知道是哪组文本框和按钮导致了Command.Execute。如果我传递与文本框绑定的内容相同的内容,即单独传递:Weight,Height,那么命令.Execute无法影响输入。通常我会传递BYREFERENCE,我的Int32会被装箱,我的通用运算函数可以对by ref参数进行运算。我可以在XAML中这样做吗?

如果我这样做,我会使用MVVM Light和
RelayCommand
。这意味着您可以在中传入一个(或多个)参数,作为绑定到
ICommand
的一部分

这意味着您可以将多个绑定连接到一个按钮上的单个事件处理程序,每个绑定可以有一个不同的参数,让您知道它来自何处

更新1

MVVM Light是一个MVVM库,它与几乎所有东西都兼容,从标准WPF到Windows 8.1再到Windows phone。看见根据NuGet下载统计数据,它可能是最流行的MVVM库,也是我倾向于选择的一个

有关如何将MVVM light与
命令参数一起使用的示例,请参阅顶部投票的答案

有关如何将两个或多个参数传递给
RelayCommand
的示例,请参阅

更新2


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

可以使用绑定属性的设置器。可以选择使用UpdateSrcTrigger=PropertyChanged。@HenkHolterman使用setters做什么?我已经在Notify场景中使用了setter,这部分工作正常。问题出在ICommand中。我也不清楚UpdateSourceTrigger将如何影响我的ICommand问题。请给出一些上下文:多重绑定类似于RelayCommand?MVVM Light与哪一代WPF XAML兼容?是图书馆吗?是的,这是总的方向。另一种选择是Caliburn.Micro,附带消息。@HenkHolterman谢谢,如果我的想法得到了你的投票,那么它们很可能在正确的轨道上。因此,具体回答我的问题,你可能不能完全按照我的意思做。所以在更高的层次上,我真正想做的是一次通过几件事情。这很好——答案在这方面看起来不错。你能详细说明我实际做的工作中的任何具体区别吗?使用XAML标记作为视图…使用Entry和People作为模型,使用ICommand和NotifyPropertyChanged作为控制器。你能详细说明这两者之间的区别,以及你建议的“将所有数据放入ViewModel”吗,“使用绑定让XAML视图更新ViewModel”问题是,当我实际上已经在遵循其中所表达的设计模式时,我是否需要开始使用一些官方的“框架工具包”,并从中获得所有好处。所有好处都是,除了一些额外的附加功能,可以实现多个附加功能,等等。