【问题标题】:WPF - binding to a property in ViewModel and to other controlWPF - 绑定到 ViewModel 中的属性和其他控件
【发布时间】:2014-10-20 13:58:57
【问题描述】:

在我的 WPF 应用程序(使用 MVVM)中,我有一个 CheckBox 和一个 TextBlock。当CheckBox 被选中时,来自TextBlock 的值将被保存。两个控件都绑定到我的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>

现在我想在用户开始输入TextBlock 时检查CheckBox。我知道绑定可以做到这一点,但我已经绑定到我的ViewModel 中的一个属性。如何绑定到ViewModel 中的属性和其他控件?

【问题讨论】:

  • 所以复选框应该既是一种保存(到哪里?)金额的方式,也是一种指示用户已经开始输入的方式?用户在开始输入时是否应该能够“保存”(那时复选框已经被选中)?也许您可以解释一下这应该如何为用户工作?
  • 更准确地说:复选框绑定到 ViewModel 上的一个属性。细节有点复杂,但这不是主要问题。我已经处理好了。我遇到的问题是从 textBlock 到 ViewModel 以及从 textBlock 到 checkBox 的绑定。
  • 让我强调一下,一旦您离开控件,文本输入控件绑定将被触发,而不是由每个字符的输入事件触发。所以你可能对每个字符的输入事件感兴趣,然后在那里设置你的布尔标志。
  • @Yury Schkatula:我将 UpdateSourceTrigger 设置为 PropertyChanged,所以应该没问题。

标签: c# wpf xaml mvvm


【解决方案1】:

您应该使用多重绑定。像这样的:

<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>

checkConverter 是一个 MultiValueConverter,您需要它来决定如何处理您绑定的值(例如 &&、|| 等)。

 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;
        }
    }

UserStartedTyping 是 ViewModel 中的一个属性,在触发 KeyDown 事件时将设置为 true。

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。理想情况下,我更愿意在 XAML 中完成这一切,并使我的 ViewModel 尽可能简单。
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多