访问用户控件中按钮的Command和CommandParameter属性

时间:2014-12-26 11:25:25

标签: wpf vb.net user-controls

我有一个简单的用户控件,我正在构建(类似于下面的插图),它本质上是一个包含许多按钮的用户控件。

enter image description here

主控件本身没有命令或命令参数属性,但它内部有四个按钮,我希望能够从视图模型访问那些我碰巧放置此控件的视图。

简单地说,最好的方法是做什么。我只是想知道点击了哪个按钮。每个按钮都被命名(因此我可以假设照顾身份识别方面)。

感谢你提出的任何建议。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望在单击这4个按钮之一时在viewmodel中调用一个方法。

关于viewmodel和view之间一般关系的简化视图可能有所帮助。从视角来看,视图模型通常通过datacontext属性访问,即datacontext属性包含viewmodel对象。

因此,将xaml中的datacontext或主用户控件后面的代码设置为要使用的viewmodel对象,并从按钮命令propeties绑定到之前设置的viewmodel上的相应ICommand属性。

namespace UserControlTest
{
    /// <summary>
    /// Interaktionslogik für MainUserControl.xaml
    /// </summary>
    public partial class MainUserControl : UserControl
    {
        public MainUserControl()
        {
            InitializeComponent();

            DataContext = new ViewModel();
        }
    }

    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public ViewModel()
        {
            Command = new RelayCommand((obj) => Debug.Print("done"));
        }

        private ICommand _command;
        public ICommand Command
        {
            get
            {
                return _command;
            }
            set
            {
                _command = value;

                RaisePropertyChanged("Command");
            }
        }


        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class RelayCommand : ICommand
    {
        #region Fields

        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;

        #endregion // Fields

        #region Constructors

        public RelayCommand(Action<object> execute) : this(execute, null) { }

        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null) throw new ArgumentNullException("execute");
            _execute = execute; _canExecute = canExecute;
        }

        #endregion // Constructors

        #region ICommand Members

        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }

        #endregion // ICommand Members
    }
}

<UserControl x:Class="UserControlTest.MainUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <StackPanel>
            <Button Height="50" Command="{Binding Command}"></Button>
        </StackPanel>
    </Grid>
</UserControl>