2017-05-11 8 views
0

Ich implementiere eine Anwendung in MVVM. Im Moment versuche ich, eine automatische Vervollständigung zu erstellen, die eine Datenbank nach möglichen Ergebnissen abfragt. Das Problem, das ich jetzt habe, ist, dass, wenn ich versuche, die Collection-Eigenschaft für das List-Feld zu setzen, ich diese Ausnahme erhalten:Ausnahme bei Datenbindung ListBox

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> 

Hier ist meine Implementierung:

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# Ansichtsmodell

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 
} 

Ich habe versucht herauszufinden, warum dies passiert, da andere Eigenschaften, die ich auf diese Weise gespeichert habe, richtig funktionieren. Weiß jemand, warum diese Ausnahme ausgelöst wird und wie man sie beheben kann?

+2

Die Fehlermeldung ist ziemlich klar. Ersetzen Sie '' durch ''. Außerdem binden Sie die ItemsSource der ListBox an 'MyCollection', während die View-Modelleigenschaft' MyListItems' zu sein scheint. Beachten Sie auch, dass das Festlegen von 'Mode = TwoWay' für die ItemsSource-Bindung sinnlos ist. – Clemens

Antwort

1
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{0} {1}"> 
        <Binding Path="Symbol"/> 
        <Binding Path="Name"/> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

Vielen Dank, ich kann nicht glauben, dass ich das vermisst habe. – Informat