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

时间:2013-10-22 13:06:28

标签: c# .net wpf

我正在尝试解决我的另一个问题(here),而我仍然坚持在代码中更改SelectedValuePath的内部。

似乎取决于我正在改变的东西,不同的事情会发生。 我研究了SO,调试了它,甚至尝试使用dotPeek在MS dll中找到有问题的代码,但到目前为止无济于事。

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

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

从bool更改为int取决于:

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

我的假设是,有人试图解析某些内容,并根据发生的情况,结果可能会或可能不起作用。

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

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

作为一种解决方法,在将SelectedValuePath设置为新属性之前将其设置为null似乎可以正常工作(避免抛出任何异常)。

修改

我已经使用更多类型更新了项目,您可以找到它here。 有问题的位在Try / Catch块中,只要出现奇怪的事情,就会显示额外的信息。

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

为什么抛出System.FormatException: Input string was not in a correct format,改变了什么? (我原本期望更改SelectedValuePath会将SelectedValue“重置”为新对象/类型

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

1 个答案:

答案 0 :(得分: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);
    }
}