IValueConverter参数用于条件转换

3
我有一个表单,其中的文本框默认输入十进制值。不幸的是,业务规则要求它们也可以接受百分比值(实际上是相同的值,只需乘以100)。为确保将正确的值插入到数据库中(例如,如果受访者输入95,则希望其变为0.95),我在相关文本框旁边添加了复选框,用户可以选择指示该值是百分比而不是十进制数。为了在未来的显示、报告等方面切换十进制数和百分比值,我正在尝试使用IValueConverter。

我已经创建了一个转换器,将字段值乘以100以显示百分比,并且(虽然我还没有进行测试)应该在保存时将该显示值重新转换回十进制数。

我的问题是如何使转换器仅在选择了复选框时起作用。从我所有的阅读中,似乎最有可能的方法是将复选框值用作IValueConverter的参数,但我不知道如何做到这一点。

所以,我的问题是:我怎样才能(或者是否可以)使用与要转换的文本框旁边的复选框的Checkbox.IsChecked值作为IValueConverter的参数来确定是否对文本框文本进行转换?问题在于如何识别与被转换的文本框相关联的复选框,并将其值传递为IValueConverter的参数。

我尝试在这里查找:如何将对另一个控件的引用作为IValueConverter参数传递?,但是它有点令人沮丧。

提前感谢。

2个回答

2

很遗憾,你不能在ConverterParameter上使用绑定,但是你可以使用IMultiValueConverter来完成这个任务。

你可以像这样使用它:

<TextBlock.Text>
  <MultiBinding Converter="{StaticResource YourConverter}">
    <Binding Path="YourDecimalProperty"/>
    <Binding Path="IsChecked" ElementName="YourCheckBoxName" />
  </MultiBinding>
</TextBlock.Text>

我已经做了这个,它可以将从数据库到GUI的值进行更改,但是当用户更改文本框中的值时,新值没有被保存回数据库。我是否遗漏了一些明显的东西,或者这听起来像一个不同的问题? - mcalex
你可能需要在MultiBinding(或每个Binding)上设置Mode=TwoWay,并确保你已经正确实现了ConvertBack方法。 - Jens
没错,(没错),我认为没错。看起来可能是验证错误。我会提出另一个问题。谢谢伙计。 - mcalex

0
首先:您不应该将控件(View)传递给转换器。传递IsChecked属性的值就足够了。
不幸的是,ConverterParameter不能进行DataBind,因为它不是DependencyProperty。作为解决方法,您可以将IsChecked属性绑定到ViewModel上的属性,然后使用ValueConverter将整个ViewModel绑定到Textbox。在ValueConverter中,您可以访问ViewModel并进行格式化。

  1. 好的,但问题不在于传递的内容,而在于如何访问它。我该如何获取文本框旁边复选框的 IsChecked 值以便将其作为参数传递?
  2. 我没有使用 SL,我正在使用 WPF。这有什么区别吗?
- mcalex
在Silverlight和WPF中,使用数据绑定设置ConverterParameter是不可能的,因为ConverterParameter不是DependencyProperty。如果您像这样设置绑定:Text={Binding}并将复选框的IsChecked属性绑定到视图模型上的属性,则转换器中的value参数将指向整个ViewModel,因此您可以访问绑定到复选框的属性。这有点丑陋,但它会起作用。 - Emond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接