我们可以通过MVVM中的ICommand点击按钮来获取按钮属性(如按钮文本,按钮隐藏状态等)

时间:2017-06-22 06:36:00

标签: c# wpf mvvm

我使用ICommand(MVVM)进行按钮点击事件,但我在这里有一点疑问。

当我使用ICommand进行按钮点击事件时,我们可以像在后面的代码中的按钮点击事件一样访问按钮的属性。

在代码后面,通过发送方对象,我们可以获得如下所示的属性,

private void BtnClicked(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        var datacontext = button.DataContext;
    }

我们可以在ICommand中这样做吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

以下是如何使用MultiBindingIMultiValueConverter的示例实现:

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>

以下是你将在VS中看到的内容:
MultiValueConverter in debug

答案 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}}" />