在此代码中:
<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中以某种方式执行此操作吗?
答案 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,我认为开发和维护起来会更容易。