【问题标题】:ComboBox binding issues with custom class自定义类的 ComboBox 绑定问题
【发布时间】:2014-08-24 21:10:45
【问题描述】:

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

public ICLINKDesignatorCandidate SelectedDesignator
  SelectedDesignator.Designator = somevalue;
...
<ComboBox Grid.Row="4" DisplayMemberPath="DisplayName"  
          SelectedValuePath="{Binding Path=DesignatorId}"  
          SelectedItem="{Binding Path=SelectedDesignator}"
          ItemsSource="{Binding DesignatorList}"  />

所以我收到绑定错误:

BindingExpression 路径错误:在“对象”“TCard4312VM”(HashCode=47413204)上找不到“DesignatorId”属性。 BindingExpression:Path=DesignatorId; DataItem='TCard4312VM' (HashCode=47413204);目标元素是 'ComboBox' (Name='');目标属性是“SelectedValuePath”(类型“字符串”)

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

因此,SelectedValuePath 正在查看 DesignatorList 中元素上属性的父视图模型 INSTEAD。 奇怪的是,当我的 DesignatorList 是“DESIGNATOR”类型的列表(这是一个实体框架实体)时,它工作得非常好,并且没有绑定问题。

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}"  />

这工作得很好,我从来没有遇到任何绑定问题,它试图在父视图模型中查找“Id”。

我在后面的代码中设置视图模型如下:

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

感谢您的帮助。我希望我已经充分解释了这个问题。

【问题讨论】:

  • 格式化你的问题。
  • 我的什么格式不正确?
  • 你看到所有的编辑了吗?空行?屏幕外的东西。
  • 很有趣,我觉得很好。屏幕外没有任何东西。
  • 是的,因为它已被其他人编辑。回到你原来的样子。它仍然有空行。

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


【解决方案1】:

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

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

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

不知怎的,我不相信你。物品来源不应影响绑定系统工作的基本机制。

【讨论】:

    【解决方案2】:

    代号标识

    不一样

    标识符号

    属性名称区分大小写
    XAML 与属性名称不匹配

    【讨论】:

      【解决方案3】:

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

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

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

      SelectedValuePath="DesignatorID"
      

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

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

        由于您要绑定到自定义对象,我建议删除 SelectedItem 属性,只保留 SelectedValue 和(更正后的)SelectedValuePath 属性。

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

        这种情况的常见解决方案是使用SelectedValueSelectedValuePath 设置所选项目,或者覆盖项目的.Equals().GetHashCode(),以便根据它们的数据将两者视为相等,而不是他们的参考。

      • 我能想到的第三件事是我在您的代码中看不到任何更改通知。可能是您为了简单而忽略了它,但是我经常会看到新的 WPF 用户忘记实现 INotifyPropertyChanged,所以我认为值得一提。 PropertyChange 通知负责在值发生更改时向 UI 发出警报,以便它可以刷新与该属性的任何绑定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2011-07-05
        • 1970-01-01
        相关资源
        最近更新 更多