2

I'm having some issues when using a converter with multiple bindings in a Silverlight project. The task is to disable a button when it is clicked, depending how four properties are evaluated in the custom converter. The flow of the task is as follows:

  • Converter fired when initialising buttons
  • Button clicked and Command fired in ViewModel
  • Keep a record of the Id of the button in one viewModel property
  • In ViewModel fire OnPropertyChanged for one of the three view model properties
  • This should fire the converter

Everything is working apart from the last step. During the second last step, I can see the Property being accessed again after the OnPropertyChanged is fired. So I can't understand why the binding doesn't pick this change up and fire the converter. I'm thinking it may be due to the button item being in a datagrid and the bindings using Path & ElementName.

I'm using a MultiBinding solution for Silverlight 5 from here.

And I've seen this question but its solution isn't available in Silverlight (Binding.IndexerName).

So on the actual control I have a datagrid where each row has a textblock and a button.

The Button IsEnabled is bound to a Converter with three values from the ViewModel (properties A-C) and one from the 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}}">

The Button Click event is bound to a command on my 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>

Firing the OnPropertyChanged event in viewModel

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

I've actually just put a hack in place to refresh the whole control which will reinitialise and re-fire the converter but any help to solve this would be much appreciated.

Community
  • 1
  • 1
bucktronic
  • 3,027
  • 2
  • 22
  • 27
  • It is a bit confusing i think. IsEnabled cannot be used in TwoWay binding because you cannot set IsEnabled property by clicking button. In addition to this, it seems you already using ViewModel for LayoutRoot too, therefore, you dont have to use MultiBinding. Using [Command Pattern](http://www.codeproject.com/Articles/79872/Step-by-Step-Guide-to-Silverlight-4-Command-Bindin) without interactivity might help. – scetiner Feb 21 '13 at 14:42
  • I completely abandoned the MultiBinding route and rewrote it so that IsEnabled was bound to a property and the property depended on PropertiesA-C. – bucktronic Feb 21 '13 at 16:51

0 Answers0