2

在 Silverlight 项目中使用具有多个绑定的转换器时遇到一些问题。任务是在单击按钮时禁用按钮,具体取决于自定义转换器中四个属性的评估方式。任务流程如下:

  • 初始化按钮时触发转换器
  • 在 ViewModel 中单击按钮并触发命令
  • 在一个 viewModel 属性中记录按钮的 ID
  • 在 ViewModel 中为三个视图模型属性之一触发 OnPropertyChanged
  • 这应该触发转换器

除了最后一步,一切都在工作。在最后第二步中,我可以看到在 OnPropertyChanged 触发后再次访问该属性。所以我不明白为什么绑定没有选择这个改变并启动转换器。我认为这可能是由于按钮项位于数据网格中以及使用路径和元素名称的绑定。

我从这里使用 Silverlight 5 的 MultiBinding 解决方案。

而且我已经看到了这个问题,但它的解决方案在 Silverlight (Binding.IndexerName) 中不可用。

因此,在实际控件中,我有一个数据网格,其中每一行都有一个文本块和一个按钮。

Button IsEnabled 绑定到一个转换器,其中三个值来自 ViewModel(属性 AC),一个来自 datagrid.ItemSource (Id)。

<Button Tag="{Binding Id}"
    IsEnabled="{multibinding:MultiBinding Mode=TwoWay,
    UpdateSourceTrigger=PropertyChanged, 
    Source1={Binding Path=DataContext.PropertyA, ElementName=LayoutRoot}, 
    Source2={Binding Path=DataContext.PropertyB, ElementName=LayoutRoot}, 
    Source3={Binding Id},
    Source4={Binding Path=DataContext.PropertyC, ElementName=LayoutRoot}, 
    Converter={StaticResource myConverter}}">

Button Click 事件绑定到我的 viewModel 上的命令。

<i:Interaction.Triggers>
  <i:EventTrigger EventName="Click">
    <i:InvokeCommandAction Command="{Binding Path=DataContext.ClickCommand, ElementName=LayoutRoot}"
                                                                CommandParameter="{Binding Id}"/>
 </i:EventTrigger>
</i:Interaction.Triggers>

在 viewModel 中触发 OnPropertyChanged 事件

public void OnClickCommand(int Id)
{OnPropertyChanged("PropertyA");}

实际上,我只是设置了一个 hack 来刷新整个控件,这将重新初始化并重新启动转换器,但是对于解决此问题的任何帮助将不胜感激。

4

0 回答 0