0

我正在尝试解决我的另一个问题(此处),但我被困在更改SelectedValuePathin 代码的内部问题上。

似乎根据我的改变,不同的事情会发生。我研究了 SO,对其进行了调试,甚至尝试使用 dotPeek 在 MS dll 中找到有问题的代码,但到目前为止无济于事。

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

从 string 更改为 int 将引发异常。

从 bool 更改为 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抛出,改变了什么?(我曾期望将SelectedValuePathwillsimply “重置”SelectedValue为新对象/类型)

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

4

1 回答 1

0

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

您如何使用 SelectedValuePath?

例如,如果您将其绑定到 TextBlock Text,那么它需要字符串。
更改 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);
    }
}
于 2013-10-22T15:35:38.377 回答