c# - 在另一个 View 模型中执行命令?

标签 c# wpf xaml mvvm icommand

我有一个从 ComboBox 派生的自定义“DateRangeSelector”控件。这是一个带有以下过滤器的下拉控件:
1. 今天
2.接下来的三天
3.接下来的三周
4.自定义范围(允许用户设置自定义日期范围)

现在这个“DateRangeSelector”控件被添加到另一个 XAML(ActivityListMenuControlView.xaml) 中:

<DateRangeSelector:DateRangeSelectorControl x:Name="DateRangeSelector"
    Grid.Column="1"
    Margin="10 0 0 0"
    HorizontalAlignment="Left"
    VerticalAlignment="Center"
    AutomationProperties.AutomationId="AID_TaskListDateRangeSelector"
    DateRangeUpdatedCmd="{Binding Path=DateRangeSelectionUpdatedCommand}"
    TodayDateUpdatedCmd="{Binding Path=TodayDateUpdatedCommand}"
    FontSize="{StaticResource TaskListMenuFontSize}"
    RangeOptions="{Binding Path=DateRangeSelectionOptions,
    Mode=OneTime}"
    SelectedDateRange="{Binding Path=SelectedRange,
    Mode=TwoWay}"
    Visibility="{Binding Path=ShowFilterOptions,
    Converter={StaticResource boolToVisibility}}" />

从上面的代码可以明显看出,我在“DateRangeSelector”中创建了一个命令“TodayDateUpdatedCmd”,旨在在系统日期更改时更新此控件中的“Today”过滤器,并绑定(bind)到“ActivityListMenuControlViewModel”中的“TodayDateUpdatedCommand”命令。
更新日期的代码位于“DateRangeSelector”本身的方法“SetDateValues”中。
我只是对如何从“ActivityListMenuControlViewModel”执行此方法感到困惑?
请帮忙。

更新:
DateRangeSelector 只是一个没有 View / View 模型的类。这是代码:
public class DateRangeSelectorControl : ComboBox, INotifyPropertyChanged
{
                  public static readonly DependencyProperty TodayDateUpdateCmdProperty = DependencyProperty.Register("TodayDateUpdatedCmd", typeof(ICommand), typeof(DateRangeSelectorControl),
    new PropertyMetadata(null));

    public ICommand TodayDateUpdatedCmd
    {
        get { return (ICommand)this.GetValue(TodayDateUpdateCmdProperty); }
        set
        {
            this.SetValue(TodayDateUpdateCmdProperty, value);
        }
    }

         /// <summary>
    /// 
    /// </summary>
    private void SetDateValues()
    {
        DateTime todaysDate = DateTime.Now;

        TodayText = Utility.GetStringFromResource("TodayLabel") + " (" + todaysDate.ToShortDateString() + ")";

        NextThreeDaysText = Utility.GetStringFromResource("NextThreeDaysLabel") + " (" + todaysDate.ToShortDateString() + " - " + todaysDate.AddDays(3).ToShortDateString() + ")";

        NextWeekText = Utility.GetStringFromResource("NextWeekLabel") + " (" + todaysDate.ToShortDateString() + " - " + todaysDate.AddDays(7).ToShortDateString() + ")";

        SetCustomDateRangeText();
    }
}

从上面的代码可以明显看出,我首先注册了一个依赖属性“TodayDateUpdateCmdProperty”和在“ActivityListMenuControlView.xaml”中使用的命令属性“TodayDateUpdatedCmd”,如 XAML 片段所示。此外,我需要在 DateRangeSelector 类中执行方法“SetDateValues”来更新今天的日期。
现在请帮助我如何实现这一目标?

更新:
根据@GazTheDestroyer 的建议,我对代码进行了更改,现在没有使用任何命令。但是现在使用以下详细信息获取运行时 XamlParseException:

“'对与指定绑定(bind)约束匹配的'VMS.Nexus.Client.Common.Controls.DateRangeSelector.DateRangeSelectorControl'类型的构造函数的调用引发了异常。'行号 '45' 和行位置 '14'。"}

内部异常:
{"默认值类型与属性类型 'TodayDate' 不匹配。"}

此异常在我创建 DateRangeSelector 的 ActivityListMenuControlView.xaml 中引发。
请帮忙

最佳答案

命令应该被触发 控件,不用作通知机制您似乎正在尝试的控制。

如果您的控件需要对一些变化的变量使用react,那么它应该公开一个 DependencyProperty 并对它的变化使用react。例如,在 DateRangeSelectorControl 的代码中

public static readonly new DependencyProperty TodaysDateProperty=
            DependencyProperty.Register("TodaysDate", typeof(DateTime), typeof(DateRangeSelectorControl), new PropertyMetadata(null, TodaysDateChanged));

public new DateTime TodaysDate
{
    get { return (DateTime)GetValue(TodaysDateProperty); }
    set { SetValue(TodaysDateProperty, value); }
}

private static void TodaysDateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((DateRangeSelectorControl)d).TodaysDateChanged((DateTime)e.NewValue);
}

private void TodaysDateChanged(DateTime newDate)
{
    //update your control here
}

然后您的 ViewModel 可以简单地公开一个 TodaysDate可以绑定(bind)到此 DependencyProperty 的属性。

关于c# - 在另一个 View 模型中执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288198/

相关文章:

c# - 如何在 as 运算符中使用变量类型

c# - 如何获取 webjob 内 azure 托管的 asp .net core 应用程序的 wwwroot 文件夹中图像文件的路径

c# - PhoneAccentColor 的 XAML 线条描边导致未处理的异常

c# - 如何使用 WPF 构建一个简单的源代码编辑器?

c# - C#本身有附加属性吗?

c# - AccessText 类的 WPF 使用和预期结果

c# - 非常大的集合的效率;迭代和排序

c# - 创建一个 RegEx 来验证用户名

c# - Xamarin Forms 框架阴影设计

c# - 限制 WPF ListView 中 TextBlock 的宽度