0

I am implementing an application in MVVM. Right now I am trying to create an autocomplete that queries a database for potential results. The issue I am having right now is that when I try to set the Collection Property for the Listbox, I get this exception:

  System.Windows.Markup.XamlParseException occurred
  HResult=0x80131501
  Message=A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
  Source=<Cannot evaluate the exception source>

Here is my implementation:

XAML

<Border Margin="5,2,5,5" Grid.Row="1" Height="Auto"
                    BorderBrush="DarkBlue"
                    BorderThickness="1" CornerRadius="4">
    <ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="40">
        <DockPanel x:Name="DockPanelA" Margin="1,1,1,1" Background="White" Height="Auto">
            ....
            <TextBox x:Name="TextBoxA" Background="{x:Null}" 
                     BorderThickness="0" Width="Auto"
                     CaretBrush="SteelBlue" FontSize="14" Foreground="SteelBlue" FontFamily="Calibri" TextAlignment="Left"
                     TextChanged="TextBoxA_TextChanged"/>
        </DockPanel>
    </ScrollViewer>
</Border>
<ListBox Grid.Row="1" Margin="5,2,5,5" MaxHeight="200" Width="{Binding ActualWidth, ElementName=DockPanelA}"
             ScrollViewer.VerticalScrollBarVisibility="Auto"  HorizontalAlignment="Stretch"
             Background="AliceBlue" BorderBrush="DarkBlue" Foreground="SteelBlue" VirtualizingStackPanel.IsVirtualizing="False"
             ItemsSource="{Binding Path=MyCollection, Mode=TwoWay}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0} {1}">
                        <Binding Path="{Binding Symbol}"/>
                        <Binding Path="{Binding Name}"/>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

C# ViewModel

public class ViewModel : INotifyPropertyChanged
{
    private ObservableCollection<ListData> _myListItems;

    ...
    public ObservableCollection<ListData> MyListItems
    {
        get { return _myListItems; }
        set { _myListItems = value; NotifyPropertyChanged("MyListItems"); }
    }
    ...

    protected virtual void NotifyPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
    ...
    public void DataSearch(object param)
    {
        ...
        Task t = Task.Run(async () =>
        {
            await Task.Delay(5000);
            try
            {
                currSrc.Token.ThrowIfCancellationRequested();
                IList<ListData> newList = Helper.QueryData(searchString);
                currSrc.Token.ThrowIfCancellationRequested();

                MyListItems = new ObservableCollection<ListData>(newList);
                //Exception is Thrown from this
            }
            catch (Exception e)
            {
            }
        });
        ...
    }
    ...
}
public class InputHandler : ICommand
{
    //View calls this and this calls DataSearch as a result
}

I've been trying to figure out why this is happening since other properties that I've databinded this way work properly. Does anyone know why this exception is thrown and how to fix it?

1
  • 2
    The error message is pretty clear. Replace <Binding Path="{Binding Symbol}"/> by <Binding Path="Symbol"/>. Besides that, you bind the ListBox's ItemsSource to MyCollection, while the view model property seems to be MyListItems. Note also that setting Mode=TwoWay on the ItemsSource binding is pointless. Commented May 11, 2017 at 16:21

1 Answer 1

1
<ListBox.ItemTemplate>
    <DataTemplate>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0} {1}">
                    <Binding Path="Symbol"/>
                    <Binding Path="Name"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </DataTemplate>
</ListBox.ItemTemplate>
Sign up to request clarification or add additional context in comments.

1 Comment

Thank-you guys so much, I can't believe i missed that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.