MVVM - WPF:在编辑TextBox时更新视图模型布尔属性

时间:2013-12-30 21:49:08

标签: wpf mvvm

我找到了一些关于如何从视图模型中选择控件的示例,但是不能在正确的术语上搜索如何使其以相反的方式工作。基本上我只想在编辑文本框时更新视图模型中的布尔值,而不是。我认为这与想知道何时获得并失去焦点是一样的。

所以我创建了一个FocusExtension类,如下所述:Set focus on textbox in WPF from view model (C#)

但它没有在我的XAML中使用以下行触发我的视图模型属性“EditingMyTargetField”的访问器:

my:FocusExtension.IsFocused="{Binding EditingMyTargetField}"

2 个答案:

答案 0 :(得分:2)

除了最佳答案之外,我还会探讨其他答案,因为其他人已经对批准的解决方案进行了改进。我用一个文本框测试了Zamotic的FocusExtension,并成功触发了绑定到viewmodel。他的解决方案具有在元素获得或失去焦点时触发的事件,然后将dependencyproperty值设置为正确的状态。我还必须在标记中明确地将绑定模式声明为TwoWay,但如果需要,您可以默认更改扩展以设置twoway绑定。

<TextBox local:FocusExtension.IsFocused="{Binding TextIsFocused, Mode=TwoWay}"/>

答案 1 :(得分:0)

我在完成您的确切要求后修改了我的答案。

当您想要在鼠标 isOver 文本框以及 NOT 时启用按钮时,您只需要使用2个事件。

这两项活动是: MouseEnter MouseLeave

这些事件捕获光标在控件上方和非光标时的时刻。

你需要一个bool属性来绑定你的Button,以便根据条件改变它的可用性*(鼠标悬停或不结束)*。

private bool _isBtnEnable = false;

        public bool IsBtnEnable
        {
            get { return _isBtnEnable; }
            set
            {
                _isBtnEnable = value;
                OnPropertyChanged("IsBtnEnable");
            }
        }

在Xaml:

  <Grid>
        <StackPanel Orientation="Horizontal">
            <TextBox Width="100" Text="{Binding 
Txt,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
 Mouse.MouseEnter="TextBox_MouseEnter" 
 Mouse.MouseLeave="TextBox_MouseLeave"/>
                <Button Width="70" Name="btn" Content="Save" Margin="20,0,0,0" 
IsEnabled="{Binding IsBtnEnable,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged
/>

        </StackPanel>

    </Grid>

在Xaml.cs中:

private void TextBox_MouseEnter(object sender, MouseEventArgs e)
        {
            IsBtnEnable = true;
        }

        private void TextBox_MouseLeave(object sender, MouseEventArgs e)
        { 

   if (string.IsNullOrEmpty(Txt)) (Checking if the TextBox is empty,remove it 
if regardless of text you want to disable the button on cursor being not over the
 TextBox but how will you click Save then because it will get disabled when you moved your mouse)
            IsBtnEnable = false;
        }

我认为这会做你想要的技巧。 :)