我想做一个购物车的功能,我用datagrid展示我已加入购物车中的数据列表,其中有一列是个数,可以动态改变其值,有一列是单价,还有一列是总价,现在我想在xaml中使用MultiBinding去计算当前的总价,我是绑定的是个数列和单价列中的 自定义控件,会提示DependencyProperty.UnsetValue的错误。请问这个该怎么绑定?
xaml代码如下:其中数量绑定的是num,单价绑定的是price,这2个变量都是我创建的类中的字段
1 <DataGridTemplateColumn Header="数量" Width="148"> 2 <DataGridTemplateColumn.CellTemplate> 3 <DataTemplate> 4 <Slider x:Name="countSlider" Value="{Binding Num,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"></Slider> 5 </DataTemplate> 6 </DataGridTemplateColumn.CellTemplate> 7 </DataGridTemplateColumn> 8 <DataGridTemplateColumn Header="单价" Width="67"> 9 <DataGridTemplateColumn.CellTemplate> 10 <DataTemplate> 11 <TextBlock x:Name="tbPrice" Text="{Binding Price}" Style="{StaticResource GridTBStyle}" 12 Foreground="{DynamicResource PhotoCellBorderBrush}"></TextBlock> 13 </DataTemplate> 14 </DataGridTemplateColumn.CellTemplate> 15 </DataGridTemplateColumn> 16 <DataGridTemplateColumn Header="总价" Width="99" x:Name="colTotalPrice"> 17 <DataGridTemplateColumn.CellTemplate> 18 <DataTemplate> 19 <TextBlock Style="{StaticResource GridTBStyle}" 20 Foreground="{DynamicResource PhotoCellBorderBrush}"> 21 <TextBlock.Text> 22 <MultiBinding StringFormat="{}{0:C}元" Converter="{StaticResource SingleToTotalMoneyConvert}"> 23 <!--<Binding ElementName="tbPrice" Path="Text" Mode="OneWay" FallbackValue="1"></Binding>--> 24 <Binding ElementName="tbPrice" Path="(TextBlock.Text)" Mode="OneWay" FallbackValue="1"></Binding> 25 <Binding ElementName="countSlider" Path="Value" Mode="OneWay" FallbackValue="1"></Binding> 26 </MultiBinding> 27 </TextBlock.Text> 28 </TextBlock> 29 </DataTemplate> 30 </DataGridTemplateColumn.CellTemplate> 31 </DataGridTemplateColumn>
转化类代码:
1 public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 2 { 3 if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue) 4 return decimal.Zero; 5 int count = 0; 6 Int32.TryParse(values[0].ToString(), out count); 7 float price = 0f; 8 float.TryParse(values[1].ToString(),out price); 9 return count * price; 10 }
效果图如下显示:数量列点击+数字自增加时,总价也能自动变化
好复杂,通常不这么做,而是给 ViewModel 增加一个“总价”属性绑定到 DataGrid 的“总价”列上,当“数量”和“单价”变动后,计算出“总价”的新值。
谢谢了,这样可以实现,就是有个问题,我用这个数量控件,还必须加一个隐藏的textblock去绑定VM里数量值,然后再把数量控件的value绑定到这个textblock上才能出来,很奇怪!
@txy0704: 你这个数量控件的 Value 不能直接绑定到 VM 里的数量值吗?