将组合框绑定到 ViewModelMain 方法

本文关键字:ViewModelMain 方法 绑定 组合 | 更新日期: 2023-09-27 18:34:53

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

我的ViewModel看起来像这样,GetMessagesTypes((方法是我感兴趣的方法。messageType 变量返回我需要绑定到组合框的消息类型列表。

任何指示将不胜感激。

  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
    }
}

将组合框绑定到 ViewModelMain 方法

在 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 集合属性中。

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