|ZYCWPF| 在MVVM中如何让窗体Load后TextBox设置焦点focus 谢谢

javamy024 2012-11-07 11:05:17
如:在非MVVM中

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
txtUser.Focus();
}

在MVVM中怎么实现
谢谢
...全文
536 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2012-11-08
  • 打赏
  • 举报
回复
这种做法存在争议,如果非要实现Pure MVVM 那么倒是也有workaround... 比如用个DataTrigger
<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。
javamy023 2012-11-08
  • 打赏
  • 举报
回复
引用 4 楼 lhx527099095 的回复:
同意2楼得观点 不要2为了mvvm而mvvm 看了楼主……
是如果是:“当窗体打开后,如何设置TextBox焦点”。我也同意2楼的方法, 但我在回复的时候声明: “但是到时如果是和我命令要完成这些功能的话就还是得在MVVM中设置Focus了” 也就是说,在我点击或执行某个命令的时候要让某个控件获得焦点呢?
lhx527099095 2012-11-08
  • 打赏
  • 举报
回复
引用 2 楼 ktei2008 的回复:
先回顾一下你的问题:“当窗体打开后,如何设置TextBox焦点”。这里面根本就没有牵扯到ViewModel,那你又何必非要在ViewModel里实现? MVVM只是一个模式,不是公式,所以该用后台代码的时候就不要犹豫。像你这个问题,直接在WindowLoaded事件里设置焦点就可以了。
同意2楼得观点 不要2为了mvvm而mvvm 看了楼主发了很多奇奇怪怪的问题 实际上我记得很久以前我师傅说过一句话很对 “当你的问题很奇怪的时候,不一定的问题本身的原因,而和方法不对,换个思路用对方法,问题迎刃而解!”
javamy024 2012-11-08
  • 打赏
  • 举报
回复
引用 2 楼 ktei2008 的回复:
先回顾一下你的问题:“当窗体打开后,如何设置TextBox焦点”。这里面根本就没有牵扯到ViewModel,那你又何必非要在ViewModel里实现? MVVM只是一个模式,不是公式,所以该用后台代码的时候就不要犹豫。像你这个问题,直接在WindowLoaded事件里设置焦点就可以了。
当然我这种Load的时候可以,但是到时如果是和我命令要完成这些功能的话就还是得在MVVM中设置Focus了 谢谢
ktei2008 2012-11-08
  • 打赏
  • 举报
回复
先回顾一下你的问题:“当窗体打开后,如何设置TextBox焦点”。这里面根本就没有牵扯到ViewModel,那你又何必非要在ViewModel里实现? MVVM只是一个模式,不是公式,所以该用后台代码的时候就不要犹豫。像你这个问题,直接在WindowLoaded事件里设置焦点就可以了。
ktei2008 2012-11-08
  • 打赏
  • 举报
回复
引用 5 楼 javamy023 的回复:
引用 4 楼 lhx527099095 的回复:同意2楼得观点 不要2为了mvvm而mvvm 看了楼主…… 是如果是:“当窗体打开后,如何设置TextBox焦点”。我也同意2楼的方法, 但我在回复的时候声明: “但是到时如果是和我命令要完成这些功能的话就还是得在MVVM中设置Focus了” 也就是说,在我点击或执行某个命令的时候要让某个控件获得焦点呢? ……
如果这样的话,比较廉价的做法是用事件。比如什么LoginFailed,然后再后台代码里添加handler就可以。如果你特别纠结后台代码的话,非要在XAML里写,参考jshi123的答案。
jshi123 2012-11-08
  • 打赏
  • 举报
回复
按照我的理解,ViewModel不应当知道UI长得什么样,当然无从直接控制UI某个元素获得焦点。 ViewModel对UI的控制应该是间接的,或者说ViewModel只是告诉UI当前模型的状态,至于如何去呈现这个状态,主动权在View手里。 UI如何根据ViewModel状态来设置焦点,1楼已经有正解。我用1楼的做法举个具体一点的例子: 比如点登录按钮时,如果登录失败,要把焦点设置到输入框(不设置的话是停留在登录按钮上)

    <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,然后根据模型状态在它们之间切换。
内容概要:本文针对网型T型三电平逆变器的低电压穿越(LVRT)能力及其综合控制策略开展深入研究,重点分析电网电压跌落条件下逆变器的动态响应特性与稳定性控制方法。研究基于Simulink平台构建详细的系统仿真模型,融合改进的电流环控制策略与点电位平衡控制算法,有效提升逆变器在故障工况下的电流跟踪精度、过流抑制能力和直流侧点电压稳定性。通过多场景仿真验证,所提出的综合控制策略能够显著增强逆变器在低电压穿越过程的鲁棒性与电能质量,确保新能源系统在电网扰动下的持续可靠并网运行。; 适合人群:电力电子、新能源发电、电力系统自动化等相关专业的研究生、科研人员及从事并网逆变器设计与控制的工程技术人员。; 使用场景及目标:①深入理解三电平逆变器在电网故障下的运行机理与控制挑战;②掌握低电压穿越技术电流限幅、故障响应及点电位平衡的核心控制方法;③应用于光伏、风电等新能源并网系统的控制策略开发与仿真验证; 阅读建议:建议结合提供的Simulink仿真模型进行动手实践,重点关注控制器参数设计、点电位观测与调节模块的实现逻辑,并通过对比不同电压跌落深度和控制策略的仿真结果,深化对系统动态行为与控制性能的理解。
yolo算法港口码头船舶目标检测数据集 目标类别:['ship'] 文类别:['船舶'] 训练集:16046 张 验证集:1971 张 测试集:983 张 总计:19000 张 该数据集提供了data.yaml文件,内容如下: train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: ['ship'] 该数据集聚焦于港口码头及近海水域的船舶检测任务,涵盖多种类型船舶在不同天气、光照和水文条件下的真实场景。图像样本覆盖了货轮、客轮、拖船、油轮及工程船等典型船只,充分体现了海上交通与港口作业的复杂性与多样性。通过高精度标注,该数据集为海上智能监控、船舶识别与航行安全预警系统提供了高质量的数据支撑,具有重要的实际应用价值。 该数据集在训练集、验证集和测试集之间实现了科学合理的分布,训练集包含16046张图像,验证集1971张,测试集983张,总计19000张。这种分布结构确保了模型在训练过程具备充足的样本学习能力,同时验证集与测试集规模适,能够有效评估模型的泛化性能与稳定性,符合深度学习项目对数据划分的标准要求。 该数据集的标注工作严谨规范,所有船舶均采用精确边界框进行标注,覆盖了不同尺寸、姿态和视角下的目标实例。标注框紧密贴合船舶轮廓,未出现明显偏移或遗漏,且在复杂背景(如水面反光、雾天、桥梁遮挡)下仍保持高一致性。标注信息完整可靠,为后续模型训练提供了坚实基础。 该数据集可广泛应用于港口自动化管理、海上交通监控、船舶动态跟踪、航道安全预警以及海洋执法等领域。其丰富的场景覆盖和多样化的船舶类型使其特别适用于智慧港口建设、海上搜救系统开发及航运物流智能化升级,能够有效提升相关系统的识别准确率与响应效率,推动海洋经济数字化转型。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧