我的组合框出现问题。我试图在运行时设置选择,但绑定不起作用。
public ICLINKDesignatorCandidate SelectedDesignator
SelectedDesignator.Designator = somevalue;
...
<ComboBox Grid.Row="4" DisplayMemberPath="DisplayName"
SelectedValuePath="{Binding Path=DesignatorId}"
SelectedItem="{Binding Path=SelectedDesignator}"
ItemsSource="{Binding DesignatorList}" />
所以我收到了一个绑定错误:
BindingExpression路径错误:&#39; DesignatorId&#39;在&#39; object&#39;上找不到的属性&#39;&#39; TCard4312VM&#39; (的HashCode = 47413204)&#39 ;. BindingExpression:路径= DesignatorId;的DataItem =&#39; TCard4312VM&#39; (的HashCode = 47413204);目标元素是&#39; ComboBox&#39; (名称=&#39;&#39); target属性是&#39; SelectedValuePath&#39; (键入&#39; String&#39;)
那么为什么要查看父视图模型而不是CLINKDesignatorCandidate对象?
因此,SelectedValuePath正在查看DesignatorList中元素的属性的父视图模型INSTEAD。 奇怪的是,当我的DesignatorList是一个类型&#34; DESIGNATOR&#34;(它是一个实体框架实体)的列表时,这个工作非常好,并且没有绑定问题。 < / p>
DisplayName显然工作正常,所以我不知道为什么DesignatorID不是。这是班级:
public class CLINKDesignatorCandidate : ICLINKDesignatorCandidate
{
public CLINKDesignatorCandidate()
{
}
public int DesignatorID { get; set; }
public DESIGNATOR Designator
{
get;
set;
}
public string DisplayName
{
get;
set;
}
}
以下是我绑定到类型DESIGNATOR(实体框架实体)列表时使用的代码:
<ComboBox Grid.Row="3" IsEditable="True"
DisplayMemberPath="DesignatorName"
SelectedValuePath="{Binding Id}"
SelectedItem="{Binding SelectedDesignator}"
ItemsSource="{Binding DesignatorList}" />
这完全没问题,我从来没有遇到任何有约束力的问题,它试图寻找&#34; Id&#34;在父视图模型中。
我在后面的代码中设置视图模型如下:
public New4312(IEquipment4312VM vm)
: this()
{
InitializeComponent();
this.DataContext = vm;
}
我在组合框的资源字典中使用DataTemplate:
<DataTemplate x:Key="resTCard4312MIP">
<Button Tag="{Binding}" >
<Grid DataContext="{Binding}">
<telerik:Tile Width="100" Background="Purple">
<ComboBox Grid.Row="4" IsEditable="True"
DisplayMemberPath="DisplayName"
SelectedValuePath="{Binding Path=DesignatorId}"
SelectedValue="{Binding Path=SelectedDesignator.DesignatorID}"
SelectedItem="{Binding Path=SelectedDesignator}"
ItemsSource="{Binding DesignatorList}" />
</Grid>
</telerik:Tile>
etc...
请记住,当我的DesignatorList是一个entites列表而不是自定义类时,所有这些代码都有效。
感谢您的帮助。我希望我已经很好地解释了这个问题。
答案 0 :(得分:0)
DesignatorId
与
不同DesignatorID
属性名称区分大小写 XAML与属性名称
不匹配答案 1 :(得分:0)
SelectedValuePath
是一个字符串属性,用于标识要用作值的项的属性名称。我认为它在内部被反射使用,但我不确定。
现在,您将该属性绑定到ComboBox.DataContext
上的属性,听起来您的绑定错误实际上是正确的:DesignatorId
上没有名为ComboBox.DataContext
的属性item,类型为TCard4312VM
将它从绑定更改为字符串,它应该可以正常工作
SelectedValuePath="DesignatorID"
至于为什么你的选择没有正常工作,可能有几个原因。
我看到的一个常见问题是,当您绑定多个Selected
属性(SelectedItem
,SelectedValue
和SelectedIndex
时,WPF会感到困惑)。所有3个属性设置完全相同,选择哪个项目,但我相信它们没有特定的顺序,设置多个可能会导致问题。
由于您绑定到自定义对象,因此我建议删除SelectedItem
属性,并仅保留SelectedValue
和(已更正的)SelectedValuePath
属性。
自定义项未被选中的第二个常见原因是WPF使用SelectedItem
将ItemsSource
与.Equals
中的项进行比较,默认情况下会比较对象< em>通过引用。因此,如果您的SelectedItem
与ItemsSource
中的项目完全相同,那么它会起作用,但是如果它不是,那么它会认为找不到该项目并且没有任何项目可以获得地选择。
此案例的常见解决方案是使用SelectedValue
和SelectedValuePath
来设置所选项目,或覆盖项目的.Equals()
和.GetHashCode()
,以便根据他们的数据,两个被认为是相同的,而不是他们的参考。
我能想到的第三件事可能是造成这种情况,因为我的代码中没有看到任何更改通知。可能是你为了简单而将其遗漏了,但是我经常会看到新的WPF用户忘记实现INotifyPropertyChanged,所以我认为值得一提。 PropertyChange通知负责在值发生更改时警告UI,以便刷新对该属性的任何绑定。
答案 2 :(得分:-1)
那么为什么它会查看父视图模型而不是CLINKDesignatorCandidate对象?
因为如果你设置这样的绑定会发生这种情况,只会对项目评估结果(值路径),而不是路径属性上的绑定。
奇怪的是,当我的DesignatorList是一个“DESIGNATOR”类型的列表(它是一个实体框架实体)时,这个工作非常好,并且没有绑定问题。
不知怎的,我不相信你。物品来源不应影响装订系统如何运作的基本机制。