【问题标题】:changing the bound object in a datatemplate更改数据模板中的绑定对象
【发布时间】:2015-05-28 12:31:40
【问题描述】:

数据模板很棒,但在特定情况下我遇到了绑定问题。我有一个类 Value,它有各种后代,如 StringValueDateValue 等。这些值显示在 Listbox 中。此模板工作正常,绑定到 StringValue 的特定属性:

<DataTemplate DataType="{x:Type values:StringValue}">
    <TextBox Margin="0.5"
             Text="{Binding Path=Native}" />
</DataTemplate>

但是,当我绑定到对象本身而不是特定属性时,更改不会更新对象,就像在这个模板中一样:

<DataTemplate DataType="{x:Type values:LookupValue}">
    <qp:IncrementalLookupBox SelectedValue="{Binding Path=., Mode=TwoWay}"
         LookupProvider="{Binding ElementName=EditWindow, Path=ViewModel.LookupProvider}">
    </qp:IncrementalLookupBox>
</DataTemplate>

IncrementalLookupBox 是一个UserControl,最终允许用户选择一个LookupValue,它应该替换模板中绑定的项目。如果这被绑定到像 int 或 string 这样的简单类型,则绑定将替换对象,所以我不确定与更复杂的对象有什么区别。我知道IncrementalLookBox 正在工作,因为将一些文本框绑定到SelectedValue 的属性(这是一个依赖属性)显示正确选择的LookupValue

如果情况更清楚,这里是 SelectedValue 的实现:

    public LookupValue SelectedValue
    {
        get { return (LookupValue)GetValue(SelectedValueProperty); }
        set { SetValue(SelectedValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedValueProperty =
        DependencyProperty.Register("SelectedValue", typeof(LookupValue), typeof(IncrementalLookupBox), new PropertyMetadata(OnSelectedValuePropertyChanged));

    private static void OnSelectedValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var obj = d as IncrementalLookupBox;
        obj.OnSelectedValuePropertyChanged(e);
    }

    private void OnSelectedValuePropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        CheckForSelectedValueInLookups();
    }

【问题讨论】:

  • hmmm.... 是否需要 SelectedValue 绑定的完整路径?
  • 听起来您的LookupValue 的属性通知未正确触发。当SelectedItemIncrementalLookupBox 上发生变化时,它需要为 LookupValue 触发 OnPropertyChanged。
  • 最好使用SelectedItem 属性而不是SelectedValue 属性,因为SelectedItem 属性与对象一起使用,而SelectedValue 属性通常用于属性来自对象的值...它应该与SelectedValuePath 属性结合使用。有关详细信息,请参阅 MSDN 上的 How to: Use SelectedValue, SelectedValuePath, and SelectedItem 页面。
  • 请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
  • @Sam:我正在尝试绑定到整个对象,而不是特定的属性。

标签: c# wpf datatemplate


【解决方案1】:

如果所有其他方法都失败了,请考虑使用 ValueConverter 来获取您需要的值。

【讨论】:

    【解决方案2】:

    编辑:这不起作用。请参阅下面的 cmets 中的链接。

    确保您的类实现 INotifyPropertyChanged 并在此处引发 PropertyChanged:

     private void OnSelectedValuePropertyChanged(DependencyPropertyChangedEventArgs e)
     {
         CheckForSelectedValueInLookups();
         // RaisePropertyChanged();
     }
    

    【讨论】:

    • 我试着确定一下,但没有任何改变。我读过的所有内容都表明您不需要具有依赖属性的 INotifyPropertyChanged。
    • 查看我对这个问题的回答:stackoverflow.com/questions/2480366/… 标记为答案的响应不起作用
    • 我想我在回复中告诉你错误 - 我很抱歉。我已经在网络上工作了几个月,在我这个年纪,它很快就离开了我的大脑。
    • 感谢您的帮助,山姆。我仍然没有运气。如果我成功地制作了一个简单的案例来说明问题,我应该将代码添加到这个问题中还是开始一个新的问题?
    • 发布到这个线程。请务必显示您设置 DataContext 的位置。
    【解决方案3】:

    我的问题和这里描述的一样:

    WPF TwoWay Binding of ListBox using DataTemplate

    显然,如果我在这里没有写足够的文字,我的回答将被转换为评论而不是结束问题。所以,总结一下这个问题,一个双向的Binding=。在 ListBox(或任何 ItemsControl I 图像)中使用的数据模板中将不起作用,因为它不是被绑定的对象本身,而是包含它的 ListBoxItem。

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多