我正在尝试解决我的另一个问题(here),而我仍然坚持在代码中更改SelectedValuePath
的内部。
似乎取决于我正在改变的东西,不同的事情会发生。 我研究了SO,调试了它,甚至尝试使用dotPeek在MS dll中找到有问题的代码,但到目前为止无济于事。
如果我从任何类型的属性更改为字符串属性,它都可以正常工作。
从string更改为int将引发异常。
从bool更改为int取决于:
我的假设是,有人试图解析某些内容,并根据发生的情况,结果可能会或可能不起作用。
由于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 :为什么索引会发生变化?
答案 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);
}
}