ComboBox与自定义类的绑定问题

时间:2014-07-03 16:21:26

标签: wpf xaml c#-4.0 entity-framework-4

我的组合框出现问题。我试图在运行时设置选择,但绑定不起作用。

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列表而不是自定义类时,所有这些代码都有效。

感谢您的帮助。我希望我已经很好地解释了这个问题。

3 个答案:

答案 0 :(得分:0)

DesignatorId

不同

DesignatorID

属性名称区分大小写 XAML与属性名称

不匹配

答案 1 :(得分:0)

SelectedValuePath是一个字符串属性,用于标识要用作值的项的属性名称。我认为它在内部被反射使用,但我不确定。

现在,您将该属性绑定到ComboBox.DataContext上的属性,听起来您的绑定错误实际上是正确的:DesignatorId上没有名为ComboBox.DataContext的属性item,类型为TCard4312VM

将它从绑定更改为字符串,它应该可以正常工作

SelectedValuePath="DesignatorID"

至于为什么你的选择没有正常工作,可能有几个原因。

  • 我看到的一个常见问题是,当您绑定多个Selected属性(SelectedItemSelectedValueSelectedIndex时,WPF会感到困惑)。所有3个属性设置完全相同,选择哪个项目,但我相信它们没有特定的顺序,设置多个可能会导致问题。

    由于您绑定到自定义对象,因此我建议删除SelectedItem属性,并仅保留SelectedValue和(已更正的)SelectedValuePath属性。

  • 自定义项未被选中的第二个常见原因是WPF使用SelectedItemItemsSource.Equals中的项进行比较,默认情况下会比较对象< em>通过引用。因此,如果您的SelectedItemItemsSource中的项目完全相同,那么它会起作用,但是如果它不是,那么它会认为找不到该项目并且没有任何项目可以获得地选择。

    此案例的常见解决方案是使用SelectedValueSelectedValuePath来设置所选项目,或覆盖项目的.Equals().GetHashCode(),以便根据他们的数据,两个被认为是相同的,而不是他们的参考。

  • 我能想到的第三件事可能是造成这种情况,因为我的代码中没有看到任何更改通知。可能是你为了简单而将其遗漏了,但是我经常会看到新的WPF用户忘记实现INotifyPropertyChanged,所以我认为值得一提。 PropertyChange通知负责在值发生更改时警告UI,以便刷新对该属性的任何绑定。

答案 2 :(得分:-1)

  

那么为什么它会查看父视图模型而不是CLINKDesignatorCandidate对象?

因为如果你设置这样的绑定会发生这种情况,只会对项目评估结果(值路径),而不是路径属性上的绑定。

  

奇怪的是,当我的DesignatorList是一个“DESIGNATOR”类型的列表(它是一个实体框架实体)时,这个工作非常好,并且没有绑定问题。

不知怎的,我不相信你。物品来源不应影响装订系统如何运作的基本机制。