Wpf 在MVVM中的TextBox.GotFocus()事件上显示日历

Wpf 在MVVM中的TextBox.GotFocus()事件上显示日历,wpf,mvvm,Wpf,Mvvm,我有一个有文本框的应用程序。获得焦点后,我需要将日历显示为弹出窗口 我的问题是如何显示订阅GotFocus事件并通过视图模型显示日历?对于像这样的视图特定任务,编写代码隐藏是可以接受的,但是如果您坚持使用干净的代码隐藏文件,请执行以下操作 您将需要MvvmLight.Extras.WPF4.dll和System.Windows.Interactivity.dll,第二个dll主要提供blend,谷歌第一个,在任何情况下,您都可以在MvvmLight包中找到它们 参考如下: xmlns:cmd="

我有一个有文本框的应用程序。获得焦点后,我需要将日历显示为弹出窗口


我的问题是如何显示订阅GotFocus事件并通过视图模型显示日历?

对于像这样的视图特定任务,编写代码隐藏是可以接受的,但是如果您坚持使用干净的代码隐藏文件,请执行以下操作

您将需要MvvmLight.Extras.WPF4.dll和System.Windows.Interactivity.dll,第二个dll主要提供blend,谷歌第一个,在任何情况下,您都可以在MvvmLight包中找到它们

参考如下:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
看到你的文本框了吗

<TextBox>
<i:Interaction.Triggers>
 <i:EventTrigger EventName="GotFocus">
    <cmd:EventToCommand Command="{Binding showCalendar, Mode=OneWay}" MustToggleIsEnabledValue="True"/>
    </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>


在视图模型上,您应该有一个绑定到日历可见性属性的属性,将其更改为在命令调用的方法中可见。

为视图特定任务编写代码是完全可以接受的,但是如果您坚持使用干净的代码隐藏文件,请执行以下操作

您将需要MvvmLight.Extras.WPF4.dll和System.Windows.Interactivity.dll,第二个dll主要提供blend,谷歌第一个,在任何情况下,您都可以在MvvmLight包中找到它们

参考如下:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
看到你的文本框了吗

<TextBox>
<i:Interaction.Triggers>
 <i:EventTrigger EventName="GotFocus">
    <cmd:EventToCommand Command="{Binding showCalendar, Mode=OneWay}" MustToggleIsEnabledValue="True"/>
    </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>


在视图模型上,您应该有一个绑定到日历可见性属性的属性,在命令调用的方法中将其更改为可见。

您真的不需要转到ViewModel进行此操作-这可以在XAML中非常简单地完成。在附加到TextBox的IsFocused属性的绑定上使用

            <TextBox x:Name="_textBox" Text="{Binding Text}" />
            <myNameSpace:Calendar Visibility="{Binding ElementName=_textBox, Path=IsFocused, Converter={x:Static _boolToVisibilityConverter}, Mode=OneWay}" />

您真的不需要转到ViewModel来实现这一点——它可以在XAML中非常简单地完成。在附加到TextBox的IsFocused属性的绑定上使用

            <TextBox x:Name="_textBox" Text="{Binding Text}" />
            <myNameSpace:Calendar Visibility="{Binding ElementName=_textBox, Path=IsFocused, Converter={x:Static _boolToVisibilityConverter}, Mode=OneWay}" />


这里的主要问题是:为什么要在
视图模型中实现纯UI功能(显示弹出窗口)?捕获
GotFocus
事件以将
弹出窗口的可见性设置为
true
在MVVM环境中应该完全可以做到这一点,因为您在这里处理的是纯UI更改我同意大马士革的观点。我想说,首选的方法是在模板中使用触发器打开弹出窗口。绑定到isfocus或IsKeyboardFocusWithin(我认为)似乎是一条出路。@Damascus我同意你的观点。我的问题是,在显示日历后,日历中的任何更改(日期选择)都需要反映在ViewModel中,并在文本框中将所选日期显示为文本。任何想法都会受到欢迎……好吧,当你创建一个WPF
弹出窗口时,你可以在里面放任何你想要的东西(我想,在你的情况下,是日历)。只需将此日历绑定到您的
ViewModel
,对UI所做的任何更改也将在ViewModel中进行。
弹出窗口
控件只是一个覆盖其他控件的容器,可以是可见的,也可以是不可见的:)感谢大马士革,您的解决方案将起作用。我的要求是这样的。我用文本框显示日期。日期可以在文本框中键入,也可以从日历中选择。最后,如果日期有效,那么我将使用该日期进行处理。在我的例子中,我只需要在viewmodel中反映日期。任何想法这里的主要问题是:为什么要在
ViewModel
中实现纯UI功能(显示弹出窗口)?捕获
GotFocus
事件以将
弹出窗口的可见性设置为
true
在MVVM环境中应该完全可以做到这一点,因为您在这里处理的是纯UI更改我同意大马士革的观点。我想说,首选的方法是在模板中使用触发器打开弹出窗口。绑定到isfocus或IsKeyboardFocusWithin(我认为)似乎是一条出路。@Damascus我同意你的观点。我的问题是,在显示日历后,日历中的任何更改(日期选择)都需要反映在ViewModel中,并在文本框中将所选日期显示为文本。任何想法都会受到欢迎……好吧,当你创建一个WPF
弹出窗口时,你可以在里面放任何你想要的东西(我想,在你的情况下,是日历)。只需将此日历绑定到您的
ViewModel
,对UI所做的任何更改也将在ViewModel中进行。
弹出窗口
控件只是一个覆盖其他控件的容器,可以是可见的,也可以是不可见的:)感谢大马士革,您的解决方案将起作用。我的要求是这样的。我用文本框显示日期。日期可以在文本框中键入,也可以从日历中选择。最后,如果日期有效,那么我将使用该日期进行处理。在我的例子中,我只需要在viewmodel中反映日期。有什么想法吗