首页 新闻 会员 周边

wpf datagrid 列值的多重绑定

0
悬赏园豆:30 [已解决问题] 解决于 2014-05-19 16:03

我想做一个购物车的功能,我用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>
View Code

转化类代码:

 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         }
View Code

效果图如下显示:数量列点击+数字自增加时,总价也能自动变化

txy0704的主页 txy0704 | 初学一级 | 园豆:89
提问于:2014-04-14 15:48
< >
分享
最佳答案
0

好复杂,通常不这么做,而是给 ViewModel 增加一个“总价”属性绑定到 DataGrid 的“总价”列上,当“数量”和“单价”变动后,计算出“总价”的新值。

收获园豆:30
Launcher | 高人七级 |园豆:45045 | 2014-04-14 15:57

谢谢了,这样可以实现,就是有个问题,我用这个数量控件,还必须加一个隐藏的textblock去绑定VM里数量值,然后再把数量控件的value绑定到这个textblock上才能出来,很奇怪!

txy0704 | 园豆:89 (初学一级) | 2014-05-19 16:02

@txy0704: 你这个数量控件的 Value 不能直接绑定到 VM 里的数量值吗?

Launcher | 园豆:45045 (高人七级) | 2014-05-19 17:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册