C# WPF:从ListBox到源的单向绑定

C# WPF:从ListBox到源的单向绑定,c#,wpf,xaml,listbox,selecteditem,C#,Wpf,Xaml,Listbox,Selecteditem,我有一个列表框,其ItemSource是一个列表,其中X定义为: public class X { public string FullPath { get; set; } } 我的模型是 public class ViewModel { public List<X> MyList { get; set; } public X MyItem { get; set; } public ViewModel() { MyList =

我有一个列表框,其ItemSource是一个列表,其中X定义为:

public class X
{
    public string FullPath { get; set; }
}
我的模型是

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"}
        };
    }
}
公共类视图模型
{
公共列表MyList{get;set;}
public X MyItem{get;set;}
公共视图模型()
{
MyList=新列表
{
新的X{FullPath=“q:\\temp\\x1.png”},
新建X{FullPath=“q:\\temp\\x2.png”}
};
}
}
和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>


当我在列表框中使用键盘上下箭头时(列表框中选择的路径中的图像显示在列表框中),这一点就起作用了。但是,当我用鼠标单击某个项目时,我单击的项目不会在列表框中被选中(鼠标单击无效)。正确的图像在图像中显示得非常短暂(几分之一秒),然后显示原始图像。我做错了什么?

因为您使用的是
StackPanel
,当
列表框
中的选择发生变化时,
图像
控件的大小可能会发生变化,因此
列表框
的位置也会发生变化

这种情况可能会导致当您释放鼠标按钮时,由于项目位置发生更改,您单击的列表项目不是同一项目


有许多解决方法,例如,固定
图像
控件的大小,使用
网格
定义布局,或者简单地将
图像
放在
堆栈面板
中的
列表框
之后,因为您使用的是
堆栈面板
,当
图像
列表框
中的选择改变时会改变,而
图像
控件的大小可能会改变,因此
列表框
的位置也会改变

这种情况可能会导致当您释放鼠标按钮时,由于项目位置发生更改,您单击的列表项目不是同一项目


有许多解决方法,例如,固定
图像
控件的大小,使用
网格
定义布局,或者简单地将
图像
放在
堆栈面板中的
列表框
之后

我无法重现您的问题。使用给定的代码,它可以在我的系统上完美地运行。我刚刚在我的系统中运行了您的代码,它工作正常,单击和键盘导航事件都工作正常。您可能需要为图像设置宽度和高度,并拉伸以填充图像,以防图像的原始宽度和高度非常大。我无法重现您的问题。使用给定的代码,它可以在我的系统上完美地运行。我刚刚在我的系统中运行了您的代码,它工作正常,单击和键盘导航事件都工作正常。您可能需要为图像设置宽度和高度,并拉伸以填充图像,以防图像的原始宽度和高度非常大。谢谢-这确实是个问题。谢谢-这确实是个问题。