【发布时间】: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