110,538
社区成员
发帖
与我相关
我的任务
分享
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
txtUser.Focus();
}
<Grid Name="LayoutRoot" DataContext="{StaticResource MyViewModelInstance}">
<Grid.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding UserShouldEditValueNow}" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=PropertySearch}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<TextBox Name="PropertySearch" Text="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Path=PropertySearch, ValidatesOnDataErrors=True}" Width="110" Height="25" Margin="10" />
</Grid>
还有个山寨做法就是在 VM 里通过 Application.Current.Windows 遍历找到当前画面
强转再找到元素设 focus。
<TextBox Height="30" Name="txtUserName" Width="160" FontSize="20" VerticalContentAlignment="Center" Text="{Binding UserNme}">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding LoginFailed}" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtUserName}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
在LoginViewModel中:
public bool LoginFailed { get; set; }
void Login(string parameter)
{
... ...
// 登录失败的时候,例如已登录的情况
if (Service.ServiceClient.Instance.IsUserNameTaken())
{
Service.ServiceClient.Instance = null;
MessageBox.Show("用户已经存在当前会议");
LoginFailed = true; // 改变模型状态
this.RaisePropertyChanged("LoginFailed"); // 通知UI对状态变化作出反应
return;
}
... ...
这样ViewModel没有访问任何UI元素,但可以间接达到控制焦点的作用。
当然上面的写法有点小复杂,好的做法是设计好不同的visual state,然后根据模型状态在它们之间切换。