2017-12-18 2 views
0

Ich habe eine ListBox dessen ItemSource ist eine Liste, in der X ist definiert als:WPF: Eine Möglichkeit zur Quelle von ListBox Bindung

public class X 
{ 
    public string FullPath { get; set; } 
} 

Mein Viewmodel ist

public class ViewModel 
{ 
    public List<X> MyList { get; set; } 
    public X MyItem { get; set; } 
    public ViewModel() 
    { 
     MyList = new List<X> 
     { 
      new X { FullPath = "q:\\temp\\x1.png"}, 
      new X { FullPath = "q:\\temp\\x2.png"} 
     }; 
    } 
} 

Und XAML:

<Window x:Class="Bind1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:Bind1" 
     Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 
    <StackPanel> 
     <Image Source="{Binding MyItem.FullPath, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="None"/> 
     <ListBox ItemsSource="{Binding MyList}" 
        SelectedItem="{Binding MyItem, Mode=OneWayToSource}" 
        SelectionMode="Single"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding FullPath}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </StackPanel> 
</Window> 

Dies funktioniert, wenn ich die Tastatur nach oben und nach unten Pfeile in der ListBox verwendet (das Bild aus dem Pfad in der ListBox angezeigt in th erscheint e <Image>). Wenn ich jedoch mit der Maus auf ein Objekt klicke, wird das Element, auf das ich klicke, nicht in der ListBox ausgewählt (der Mausklick hat keine Wirkung). Das korrekte Bild wird sehr kurz im Bild angezeigt (ein Bruchteil einer Sekunde), dann wird das Originalbild angezeigt. Was mache ich falsch?

+0

Ich kann Ihr Problem nicht reproduzieren. Mit dem gegebenen Code läuft es perfekt auf meinem System. – Lauraducky

+1

Ich habe gerade Ihren Code in meinem System ausgeführt und es funktioniert gut, sowohl Klick-und Tastaturnavigationsereignis funktioniert gut. Sie müssen möglicherweise eine Breite und Höhe für Ihr Bild festlegen und strecken, um zu füllen, falls die ursprüngliche Breite und Höhe des Bildes sehr groß ist. –

Antwort

3

Da Sie StackPanel verwenden, während die Image Änderungen bei der Auswahl Änderung der ListBox, die Größe der Image Steuerung ändern kann, damit auch die Lage des ListBox.

Ein solcher Fall kann dazu führen, dass der Listeneintrag, auf den Sie klicken, nicht identisch ist, wenn Sie die Maustaste loslassen, da sich die Position des Elements geändert hat.

Es gibt viele Abhilfe, z. fixieren die Größe der Image Steuerung verwenden Grid ein Layout zu definieren, oder setzen Sie einfach die Image nach dem ListBox in der StackPanel

+0

Danke - das ist in der Tat das Problem. –

-1

ich das Problem reproduzieren können, und Sie können die Bildgröße beheben oder die Bildsteuerung unter dem Listenfeld bewegen . Ich stimme mit Evan

+1

Es ist sinnlos, einen einzigen Satz zu schreiben, der einfach die in einer anderen Antwort erwähnten Lösungen wiederholt. Keine Ahnung, warum das eine positive Bewertung bekommen hat. – Clemens