C# WPF-绑定到ViewModel中的属性和其他控件

C# WPF-绑定到ViewModel中的属性和其他控件,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,在我的WPF应用程序(使用MVVM)中,我有一个复选框和一个文本块。选中复选框时,将保存文本块中的值。这两个控件都绑定到myViewModel。下面是简化的XAML: <StackPanel> <Label>Add to list</Label> <CheckBox IsChecked="{Binding Path=AddItem}"></CheckBox> <Label>Gross amount:&

在我的WPF应用程序(使用MVVM)中,我有一个
复选框
和一个
文本块
。选中
复选框时,将保存
文本块中的值。这两个控件都绑定到my
ViewModel
。下面是简化的XAML:

<StackPanel>
    <Label>Add to list</Label>
    <CheckBox IsChecked="{Binding Path=AddItem}"></CheckBox>
    <Label>Gross amount:</Label>
    <TextBlock Text="{Binding Path=Amount}"></TextBlock>
</StackPanel>

添加到列表中
总额:

现在,当用户开始在
文本块中键入内容时,我希望选中
复选框
。我知道绑定可以做到这一点,但我已经绑定到我的
ViewModel
中的属性。如何绑定到
ViewModel
中的属性和其他控件?

当用户开始更改金额值时,可以尝试将AddItem设置为true:

private string _amt;

public string Amount
{
    get{return _amt;}
    set
    {
         _amt = value; 
        if(AddItem == false)
            AddItem = true;

        //PropertyChanges here
    }
}

您应该使用多重绑定。大概是这样的:

<CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="191,82,0,0" VerticalAlignment="Top">
            <CheckBox.IsChecked>
                <MultiBinding Converter="{StaticResource checkConverter}">
                    <Binding Path="IsChecked"/>
                    <Binding Path="UserStartedTyping"/>
                </MultiBinding>
            </CheckBox.IsChecked>   
 </CheckBox>
UserStartedTyping是ViewModel中的一个属性,当触发KeyDown事件时,该属性将设置为true


希望有帮助。

所以复选框应该既是一种保存(到哪里?)金额的方式,也是一种指示用户已开始键入的方式?当用户开始输入时,是否应该能够“保存”(此时复选框已被选中)?也许您可以解释这对用户是如何工作的?更准确地说,复选框绑定到ViewModel上的属性。细节有点复杂,但这不是主要问题。我已经处理好了。我遇到的问题是从textBlock到ViewModel以及从textBlock到复选框的绑定。让我强调一下,文本输入控件绑定将在您离开控件后触发,而不是通过每字符输入事件触发。所以您可能对每字符输入事件感兴趣,然后在那里设置布尔标志。@Yury Schkatula:我将UpdateSourceTrigger设置为PropertyChanged,所以应该可以。谢谢您的回复。理想情况下,我更愿意在XAML中完成这一切,并使我的ViewModel尽可能简单。
 public class CheckConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            return (bool)((bool)values[0] || (bool)values[1]);

        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            object[] splitValues = { value, false };
            return splitValues;
        }
    }