C# 首次加载视图时,DataTemplate内的绑定不起作用
我在试图绑定到视图模型中的属性的自定义控件上有一个依赖属性。控件位于视图中的C# 首次加载视图时,DataTemplate内的绑定不起作用,c#,wpf,data-binding,datatemplate,C#,Wpf,Data Binding,Datatemplate,我在试图绑定到视图模型中的属性的自定义控件上有一个依赖属性。控件位于视图中的DataTemplate内(aUserControl)。但是,绑定似乎只有在视图加载后绑定特性发生更改时才起作用 下面是视图XAML中的示例: <dxb:BarStaticItem Alignment="Far"> <dxb:BarStaticItem.ContentTemplate> <DataTemplate> <control
DataTemplate
内(aUserControl
)。但是,绑定似乎只有在视图加载后绑定特性发生更改时才起作用
下面是视图XAML中的示例:
<dxb:BarStaticItem Alignment="Far">
<dxb:BarStaticItem.ContentTemplate>
<DataTemplate>
<controls:AllMaxDateRangeCombo Grid.Row="1"
DateRange="{Binding DataContext.WorkOrderDateRange, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"
TimeFrameType="Current"
Width="150" />
</DataTemplate>
</dxb:BarStaticItem.ContentTemplate>
</dxb:BarStaticItem>
BarStaticItem
是在工具栏中放置“普通”控件时使用的DevExpress控件。我在AllMaxDateRangeCombo
中定义的绑定在首次加载视图时不起作用。但是在运行时(调试期间),如果要通过在属性名称的末尾添加一个数字来更改属性名称,然后立即删除该数字,那么绑定将开始工作
由于缺乏更好的理解,我只能说,在第一次加载时,绑定似乎没有正确地“连接”,或者它在某个部分准备好之前就尝试了。但当我在运行时进行更改时,它突然被链接起来
我希望有人能帮我弄清楚这里到底发生了什么
注意:使用Snoop工具,我可以看到控件的dependency属性DateRange
在我进行运行时更改之前根本没有绑定。然后,出现一个绑定。所以无论出于什么原因,我定义的绑定都不会在第一次加载视图时启动
编辑:作为对一个问题的回答,我将解释一些机械原理。
AllMaxDateRangeCombo
基本上是一个组合框,包含诸如LastMonth、Today、LastWeek等选项。在进行选择时,将重新计算日期范围并将其分配给控件的DateRange
依赖属性。因为这是我试图绑定到的属性,所以我希望UI视图模型的属性也会随之改变。然后我将响应并更新UI数据。但这种财产价值永远不会改变。因此,要么绑定从未真正连接,要么它不知何故无法通知更改。这最终是由于控件中的值是如何更改的。在控件中,定义了此依赖项属性:
public static DependencyProperty DateRangeProperty = DependencyProperty.Register("DateRange", typeof(DateTimeRange), typeof(AllMaxDateRangeCombo), new PropertyMetadata(new DateTimeRange(DateTime.MinValue, DateTime.MaxValue)));
public DateTimeRange DateRange
{
get => (DateTimeRange)GetValue(DateRangeProperty);
set => SetValue(DateRangeProperty, value);
}
组合框选择更改后,将设置该值:
private void RecalculateDates()
{
DateRange = new DateTimeRange(DateTime.MinValue, DateTime.MaxValue);
}
只要控件的使用不在DataTemplate
中,就可以在双向绑定中正常工作。但一旦在数据模板
中使用它,则只有此版本有效:
SetCurrentValue(DateRangeProperty, new DateTimeRange(DateTime.MinValue, DateTime.MaxValue));
我不知道答案,但我会投票赞成你的问题,因为我认为这是一个解释得很好的问题,我也想知道答案。PS:你能上传这个项目或者类似的东西吗(可能在githiub上)?如果我能下载它去除虫,那就太好了。最好的regards@AdrianEfford非常感谢。很遗憾,我无法上传。部分原因是因为它是一个巨大的项目,但也因为它是专有的工作。@DonBoitnott:你是说
DateRange
属性不是初始设置的吗?你是如何证实这一点的?workOrderDaterRange
源属性的默认值是多少?您确定它与DateRange
的默认值不同吗?@mm8它得到一个默认值,基本上是日期最小值/最大值。不,我想说的是,绑定似乎没有发生。控件类似于组合框,当进行选择(例如LastMonth)时,DateRange将相应地设置。我正试图响应这种变化并更新UI数据,但我的视图模型的属性从未改变,因此我认为绑定并没有真正连接起来。或者至少由于某种原因它不能通知。@DonBoitnott:如果你想让任何人指出原因,你需要提供一份关于这个问题的报告。