2
votes

All, I'm pounding my head against the wall here. What I need is simple, and I'm sure there is a simple answer, but I can't seem to find it. Situation: I have a Silver light 4.0 app and I'm currently binding a list of strings to an Items control. In the data template for that I have a simple text box that I was doing very basic Binding "{Binding}". I need to update the binding to be twoway so the edits are automatically pushed back to my datacontext.

Here is the Items control before I update the binding:

<ItemsControl x:Name="spLiftHeader" ItemsSource="{Binding Path=WeekLabels}">
   <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
             <StackPanel x:Name="spLiftHeader" Orientation="Horizontal" />
        </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
         <DataTemplate>
              **<TextBox x:Name="txtWeekLbl" Text="{Binding}" Foreground="Black" Width="125" TextAlignment="Center"/>**
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Here is the items control after the binding change:

<ItemsControl x:Name="spLiftHeader" ItemsSource="{Binding Path=WeekLabels}">
   <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
              <StackPanel x:Name="spLiftHeader" Orientation="Horizontal" />
        </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
        <DataTemplate>
            **<TextBox x:Name="txtWeekLbl" Text="{Binding Mode=TwoWay}" Foreground="Black" Width="125" TextAlignment="Center"/>**
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

I've just simply added the "Mode=TwoWay" to the binding. After updating that, I get the amazingly useless error 4004 "System.Windows.Markup.XamlParseException: Provide value on 'System.Windows.Data.Binding' threw an exception" and the Line/Position reference points right do my updated Binding. How does one add the Two Way mode to the simple binding? Thanks in advance. Nick

2
+1 Welcome to Stack Overflow :) - Gone Coding

2 Answers

1
votes

Two-way binding to an entire object (a string in this case) makes no sense to Silverlight so it is correct to throw an exception. Shame it is not a more useful error message :)

When there is no Path in the binding the ItemsControl can fetch a value using Object.ToString(), but where will it store the result back? It can't replace the string as that would require placing a new string object back in the collection. Two-way binding is done via reflection against a property of an object.

Instead of a simple list of strings, use a list of some new object that contains a string property and explicitly bind to that property. It will make everything a lot easier. (Make sure your new class and property implement INotifyPropertyChanged).

0
votes

I am not 100% sure, but I don't think the the Mode=TwoWay should be set in the TextBox itself.

If that doesn't work, try it on both. However, in either case do not use List<T> as a data source behind that items control. Lists do not fire changed event when one of its items has changed. Use ObservableCollection<T> (from the System.Collections.ObjectModel namespace) instead of the List<T>