我正在使用MVVM。在我的视图中,我有一个默认隐藏的控件,它的Visibility属性是Binded to ViewModels属性。
<Grid>
<TextBox Visibility={Binding IsVisible, Mode=OneWay, Converter={StaticResource MyVisibilityConverter}}/>
<Grid>
在ViewModel中我有一个属性
private bool _isVisible;
bool IsVisible
{
get {return _isVisible;}
set {_isVisible = value; NotifyOfPropetyChanged(() => IsVisible);}
}
非常直接,显示我刚刚做的控件
IsVisible = true;
在我的ViewModel中,TextBox变得可见,按预期正常工作。
我想要做的是在TextBox变得可见之后将其设置在TextBox上。问题是我无法找到任何好的解决方案来确定这个特定的控件是否可见,这是我可以设置焦点的那一刻。 解决方案是测试LayoutUpdated事件中的可见性,但它绝对不是代码中最好的东西。 有更好的解决方案吗?
编辑: 澄清 - 我不想通过ViewModel的MVVM设置焦点。从代码隐藏设置焦点没有问题,因为它是UI行为。唯一的问题是如何确定何时这样做。在设置ViewModel属性和更新布局以匹配其状态之间有一段时间。在那段时间之后,我希望能够捕捉到任何可以通知我的信息,我的能见度已经改变,现在你可以改变焦点&#34;
答案 0 :(得分:2)
您可以使用RegisterPropertyChangedCallback为文本框的Visibility属性注册更改回调。然后在更改后的回调方法中,您可以设置焦点是可见性是可见的。
将它放在后面代码的构造函数中:
TextBox1.RegisterPropertyChangedCallback(UIElement.VisibilityProperty, VisibilityChanged);
并添加CallBack方法:
private void VisibilityChanged(DependencyObject sender, DependencyProperty dp)
{
if (((UIElement)sender).Visibility == Visibility.Visible)
{
TextBox1.Focus(FocusState.Keyboard);
}
}