我使用ICommand(MVVM)进行按钮点击事件,但我在这里有一点疑问。
当我使用ICommand进行按钮点击事件时,我们可以像在后面的代码中的按钮点击事件一样访问按钮的属性。
在代码后面,通过发送方对象,我们可以获得如下所示的属性,
private void BtnClicked(object sender, RoutedEventArgs e)
{
var button = sender as Button;
var datacontext = button.DataContext;
}
我们可以在ICommand中这样做吗?
提前致谢
答案 0 :(得分:2)
以下是如何使用MultiBinding
和IMultiValueConverter
的示例实现:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace SO_app.Converters
{
class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
foreach (var item in values)
{
//process the properties passed in
}
return new object();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
然后在你的xaml中:
<Window x:Class="SO_app.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SO_app"
xmlns:converter="clr-namespace:SO_app.Converters"
mc:Ignorable="d"
xmlns:vm="clr-namespace:VM;assembly=VM"
Title="TestWindow" Height="300" Width="300">
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
<Window.Resources>
<converter:MultiValueConverter x:Key="mvc"/>
</Window.Resources>
<Grid>
<Button Command="{Binding SomeCommand}" Content="Some value here">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource mvc}">
<Binding Path="Visibility" RelativeSource="{RelativeSource Self}"/>
<Binding Path="Content" RelativeSource="{RelativeSource Self}"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</Grid>
答案 1 :(得分:1)
我更喜欢的解决方案,因为它可以让您ViewModel
清除任何View
内容:
将Button
的必需属性绑定到DataContext
中的属性。在命令实现中,使用DataContext
的相应属性。 (假设DataContext
是您的ViewModel
并且还包含命令实现。)
在MVVM中,使用ViewModel中属性的绑定将这些属性(很少例外)应该设置为它们的值,即ViewModel应该已经具有与所需按钮属性相对应的属性。那么为什么不在命令实现中简单地使用它们呢?
如果您仍希望在命令实现中使用该按钮,则可以将CommandParameter
绑定到Button
:
<Button x:Name="MyButton" Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyButton}"/>
并在命令实现中将参数强制转换为Button
并访问其属性:
private void MyCommandImplementation(object prm)
{
var button = prm as Button;
//...
}
或者,您可以将所需的属性(而不是整个Button
)绑定到CommandParameter
。
答案 2 :(得分:1)
您可以将按钮本身绑定为CommandParameter
<Button Command="{Binding EditCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}" />