gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:46:38 24 4
gpt4 key购买 nike

我有一个从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com