将Combobox绑定到ViewModelMain方法

时间:2014-12-19 14:26:32

标签: c# wpf mvvm combobox

我有一个组合框,当用户从存储在我的ViewModelMain类中的变量中的数据中选择它时,我需要填充它,但不能使它工作。

我的ViewModel看起来像这样,GetMessagesTypes()方法是我感兴趣的方法.messageType变量返回一个MessageTypes列表,我需要将它绑定到我的组合框。

任何指针都将不胜感激。

  namespace Toolbox.ViewModel
{
    [ImplementPropertyChanged]
    internal class ViewModelMain
    {
        #region Fields
        private readonly IActionLogRepository m_ActionLogRepository;
        #endregion

        #region Properties
        public DateTime QueryFromDate { get; set; }
        public DateTime QueryToDate { get; set; }
        public int TopXRecords { get; set; }
        public ICommand SearchTopXRecord { get; private set; }
        public ICommand GetListOfmessageTypes { get; set; }
        public ICommand SearchDateCommand { get; private set; }
        public object SelectedMessageBody { get; set; }
        public ObservableCollection<IActionLog> Messages { get; set; }

        #endregion

        #region Constructor
        //Should use injection container
        public ViewModelMain(IActionLogRepository actionLogRepository)
        {
            QueryToDate = DateTime.Now;
            QueryFromDate = DateTime.Now.Subtract(TimeSpan.FromDays(1));
            m_ActionLogRepository = actionLogRepository;
            Messages = new ObservableCollection<IActionLog>();
            SearchDateCommand = new SimpleCommand { ExecuteDelegate = SetActionLogsBetweenDates };
            SearchTopXRecord = new SimpleCommand { ExecuteDelegate = SetActionLogsForTopXRecords };

            SetActionLogs();
            //GetMessagesTypes();
        }
        #endregion

        #region Methods
        private void SetActionLogs()
        {
            List<IActionLog> actionLogs = m_ActionLogRepository.GetAllActionLogs();

            Messages.Clear();
            actionLogs.ForEach(actionLog => Messages.Add(actionLog));
        }

        public void SetActionLogsBetweenDates()
        {
            List<IActionLog> actionLogs = m_ActionLogRepository.GetAllActionLogsBetweenDates(QueryFromDate, QueryToDate);

            Messages.Clear();
            actionLogs.ForEach(actionLog => Messages.Add(actionLog));
        }

        public void SetActionLogsForTopXRecords()
         {
             List<IActionLog> actionLogs = m_ActionLogRepository.GetAllTopXActionLogs(TopXRecords);

            Messages.Clear();
            actionLogs.ForEach(actionLog => Messages.Add(actionLog));
        }

        public string GetMessagesTypes()
        {

            List<IActionLog> actionLogMessageType = m_ActionLogRepository.GetAllActionLogs();

            var messageType = (
                from messageTypes in actionLogMessageType
                select messageTypes.MessageType).Distinct();
            return messageType.ToString(); //Return Messages types
        }

        #endregion
    }
}

1 个答案:

答案 0 :(得分:1)

在WPF中,我们没有数据绑定方法的结果。相反,你有几个选择...事情是你需要在视图模型中执行,以便您可以调用您的方法。调用方法后,应将结果值设置为数据绑定到ComboBox.ItemsSource属性的集合属性。

您可以在视图模型中执行的一种方法是将属性数据绑定到SelectedItem属性(或类似属性)。每次所选项目更改时,执行将转到视图模型,您可以调用您的方法。举一个小例子:

private YourDataType selectedItem = new YourDataType();
public YourDataType SelectedItem
{
    get { return selectedItem; }
    set 
    {
        selectedItem = value; 
        NotifyPropertyChanged("SelectedItem"); 
        DoSomethingWithSelectedItem(SelectedItem); // <-- Call method here
    }
}

在正确的点上执行视图模型的另一种方法可能是实现某种ICommand在某种情况下被触发的......只要你得到执行,这取决于你在正确的时间进入视图模型,以便您调用方法并将结果填充到public集合属性中。

你没有非常清楚地解释你的情况,所以这个解决方案可能不适合你,但你应该明白并能够从中抽象出一个解决方案。