SelectedValuePath的内部如何工作(在组合框/列表框上)

本文关键字:组合 列表 工作 内部 何工作 SelectedValuePath | 更新日期: 2023-09-27 18:36:20

我正在尝试解决我的另一个问题(在这里),但我被困在更改代码SelectedValuePath的内部

似乎根据我从/到什么,会发生不同的事情。我已经研究了SO,调试了它,甚至尝试使用dotPeek在MS dll中找到有问题的代码,但到目前为止无济于事。

如果我从任何类型的属性更改为字符串属性,它可以正常工作。

从字符串更改为 int 将引发异常。

从布尔值更改为 int 取决于:

  • 如果属性为 false,则所选索引将更改为 0,所选值将更改为 false(不是 int,因为它应该是)
  • 如果该属性为 true,则所选索引将更改为 -1,并且所选值将为 null。

我的假设是,有人试图在某个地方解析某些东西,根据发生的事情,结果可能会也可能不会起作用。

由于SelectedValuePath接收字符串作为输入,并且仅将SelectedValue设置为它们指向的任何内容。我希望在更改此值时,SelectedItem不会更改,并且将显示正确的值。我没想到会得到这么多不同的结果/异常/行为......

唯一想到的是,SelectedValue的类型设置为SelectedValuePath指向的任何属性,然后当它发生变化时,它可能会遇到错误的类型......

作为一种解决方法,在将SelectedValuePath设置为新属性之前将其设置为 null 似乎有效(避免引发任何异常)。

编辑

我已经用更多类型更新了该项目,你可以在这里找到它。违规位位于 Try/Catch 块中,每当发生奇怪的事情时都会显示额外的信息。

问题1:让我困惑的行为是:从字符串更改为任何其他类型(一旦你选择一个项目),将抛出异常,SelectedValue将不再改变(将其设置为默认值将解决此问题)。

为什么抛出System.FormatException: Input string was not in a correct format,发生了什么变化?(我预计更改SelectedValuePath只会将SelectedValue"重置"为新对象/类型)

此外,在大多数情况下,更改SelectedValuePath会将 SelectedIndex 重置为 -1 或 0。问题2:为什么指数会改变?

SelectedValuePath的内部如何工作(在组合框/列表框上)

不是真正的答案,但评论太多了

您如何使用 SelectedValuePath?

例如,如果要将其绑定到文本块文本,则它需要字符串。
更改选定值路径的类型对我来说没有意义例如:

<TextBlock Text="{Binding ElementName=employeeListBox, 
                      Path=SelectedValue}"

不打算下载和调试您的代码,但这个简单的例子不会为我抛出异常

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    lbNoBinding.SelectedValuePath = "StrMix";
    lbNoBinding.DisplayMemberPath = "StrMix";
}
public class MixedType
{
    public string StrMix { get { return "strMix"; } }
    public bool BoolMix { get { return true; } }
}
private List<MixedType> mixedTypes = new List<MixedType>() { new MixedType(), new MixedType() };
public List<MixedType> MixedTypes
{
    get { return mixedTypes; }
}
private void btnClick(object sender, RoutedEventArgs e)
{
    try
    {                
        lbNoBinding.SelectedValuePath = "BoolMix";
        lbNoBinding.DisplayMemberPath = "BoolMix";
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}