【问题标题】:WPF User Control Not Data BindingWPF 用户控件不是数据绑定
【发布时间】:2016-11-29 05:46:17
【问题描述】:

在我的用户控件中,我有一个不是数据绑定的依赖项属性。我查看了几个堆栈溢出帖子,但我无法弄清楚我做错了什么。永远不会调用 Property changed 方法。到目前为止我的代码:

我的用户控件基本上是一个增强的组合框。 DP 位于用户控件内部。我在数据网格中使用此用户控件。

用户控件的数据上下文是这样设置的。 DataContext={绑定RelativeSource={RelativeSource Self}}

#region ProfileType DP

    public static FrameworkPropertyMetadata ProfileTypeMetaData = new FrameworkPropertyMetadata(ProfileTypes.Default,
                                                                 FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
                                                                FrameworkPropertyMetadataOptions.Journal, new PropertyChangedCallback(ProfileType_PropertyChanged),
                                                                new CoerceValueCallback(ProfileType_CoerceValue),
                                                                false, UpdateSourceTrigger.PropertyChanged);

    public static readonly DependencyProperty ProfileTypeProperty = DependencyProperty.Register(nameof(ProfileType), typeof(ProfileTypes),
                                                                  typeof(MyClass), ProfileTypeMetaData, new ValidateValueCallback(ProfileType_Validate));

    private static void ProfileType_PropertyChanged(DependencyObject dobj, DependencyPropertyChangedEventArgs e)
    {
        MyClass tp = (MyClass)dobj;
        tp.SetUpProfiles();
    }

    private static object ProfileType_CoerceValue(DependencyObject dobj, object Value)
    {
        return Value;
    }

    private static bool ProfileType_Validate(object Value)
    {
        return true;
    }

    public ProfileTypes ProfileType
    {
        get
        {
            return (ProfileTypes)this.GetValue(ProfileTypeProperty);
        }
        set
        {
            this.SetValue(ProfileTypeProperty, value);
        }
    }

    #endregion

在我的 xaml 文件中,我有以下内容:

<DataGrid ItemsSource="{Binding Missmatches}" CanUserAddRows="False" AutoGenerateColumns="False">
   <DataGrid.Columns>
      <DataGridTextColumn Header="Target Profile" Binding="{Binding OldProfile}" />
          <DataGridTemplateColumn Header="Mismatched Profile">
             <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Tekla:TeklaProfiles SelectedProfile="{Binding NewProfile}" ProfileType="{Binding Type}" />
                  </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
           </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

DataGrid 绑定到 ObservableCollection。集合中的每个对象都包含三个自动道具。

private ObservableCollection<ProfileMismatch> _missmatches;
        public ObservableCollection<ProfileMismatch> Missmatches
        {
            get { return _missmatches; }
            set
            {
                if (_missmatches == value)
                    return;
                _missmatches = value;
                RaisePropertyChanged(nameof(Missmatches));
            }
        }

无论我尝试什么,我似乎都无法让用户控件进行数据绑定。如果有人有一些专业提示,请告诉我。

【问题讨论】:

  • “我的类包含数据”:这是网格中的内容吗?它是什么样子的? MyUserControls:Profiles 是什么? ProfileType 和这个有什么关系?这里可能会出现一些问题,但除非您提供足够的代码来重现问题,否则无法猜测。
  • 您是否正确设置了视图的DataContext
  • 是的。数据网格的第一列绑定正确。
  • CoerceValue 和 Validate 回调是什么意思?除了默认行为之外,它们不会做任何其他事情。
  • 我目前正在使用它们进行调试。我在看价值观

标签: c# wpf data-binding


【解决方案1】:

用户控件的数据上下文是这样设置的。 DataContext={Binding RelativeSource={RelativeSource Self}}

删除它。显式设置 UserControl 的 DataContext 可防止从控件的父级继承 DataContext,例如这里:

<DataTemplate>
    <Tekla:TeklaProfiles SelectedProfile="{Binding NewProfile}"
                         ProfileType="{Binding Type}" />
</DataTemplate>

预计绑定将针对当前 DataContext 进行解析,即具有 NewProfileType 属性的视图模型对象。但是,由于您已显式设置 UserControl 的 DataContext(对其自身),它不会起作用。


所以不要显式设置 UserControl 的 DataContext。绝不。任何告诉你的博客或在线教程都是完全错误的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多