在WPF MVVM中绑定多绑定文本框

时间:2015-05-29 07:32:28

标签: wpf mvvm

我有3个TextBox绑定我的类( Transaction )这样的属性

<TextBox Text="{Binding Path=Transaction.Bills100,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Name="bills100" Grid.Column="2" Grid.Row="1" Margin="7"></TextBox>
<TextBox Text="{Binding Path=Transaction.Bill50,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Name="bills50" Grid.Column="2" Grid.Row="2" Margin="7"></TextBox>
<TextBox Text="{Binding Path=Transaction.Bill20,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Name="bills20" Grid.Column="2" Grid.Row="3" Margin="7"></TextBox>

此外,我还有另一个TextBox,我已经完成了多重绑定,并添加了前三个文本框,如

 <TextBox Grid.Column="2" IsReadOnly="True" Grid.Row="7" Grid.ColumnSpan="2" Margin="7" Name="TotalBills">
   <TextBox.Text>
        <MultiBinding Converter="{ikriv:MathConverter}" ConverterParameter="x+y+z" Mode="TwoWay">
            <Binding Path="Text" ElementName="bills100" />
            <Binding Path="Text" ElementName="bills50" />
            <Binding Path="Text" ElementName="bills20" />
         </MultiBinding>
     </TextBox.Text>
 </TextBox>

我想将此多重绑定文本框与我的类( 事务 )绑定,并将属性设置为Transaction.Total,就像我的前三个文本框一样,但它显示错误

  

属性文本多次设置

1 个答案:

答案 0 :(得分:2)

实际上,我们无法从一个属性获取双向绑定的值,然后设置另一个属性的值。 最后我找到了这样的解决方案  在我的班级交易中

private double _totalBills; 
public double TotalBills
{
    get { return _totalBills; }
    set { _totalBills= value; Notify("TotalBills"); }
}

在XAML中(而不是多重绑定)

<TextBox Text="{Binding Path=Transaction.TotalBills,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" IsReadOnly="True" Grid.Row="7" Grid.ColumnSpan="2" Margin="7" Name="TotalBills"/>

我的ViewModel

 public class MainViewModel: INotifyPropertyChanged
{
    private Transaction _transactionDetails;
    public MainViewModel()
    {
        Transaction= new Transaction();
       _transactionDetails.PropertyChanged += _transactionDetails_PropertyChanged;
    }
    private void _transactionDetails_PropertyChanged(object sender,PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "TotalBills":
                _calculate(); //My method for calculation
                break;
        }
    }
}