【发布时间】:2016-02-02 12:35:45
【问题描述】:
我正在使用 ContentControl 根据用户通过 DataTemplateSelector 选择的对象类型来更改 UI 中显示的控件。
当控件被卸载时,基于替换下面 ContentControl 中的内容,我无法再访问 附加行为的 Unloaded 事件处理程序中附加行为的属性。
例如,如果用户在 UI 中单击钻机单元,然后单击燃料卡车单元,则我无法访问控件中的附加属性。就像卸载控件时为时已晚,无法读取附加属性 当 DateTemplateSelector 触发时。
如果控件被卸载是因为我关闭了父窗口或其他一些原因,比如隐藏了父文档选项卡,那么我 读取附加的行为属性值没有问题。
这是失败的代码片段:
代码试图从下面找到附加的行为属性:“behaviours:PersistUiBehavior.PersistanceChildCode” 我期望“结果”等于 17 或 18,具体取决于控件何时处于活动状态。
public static void GetPersistenceRequiredControls(DependencyProperty property, DependencyObject root, int code, List<object> sources)
{
if ((property != null) && (root != null))
{
// property = behaviours:PersistUiBehavior.PersistanceChildCode does not exist here when unloaded
var result = (int) root.GetValue(property);
if (result == code)
{
sources.Add(root);
}
}
}
这是一个显示各个部分的 XAML 片段:
<UserControl x:Class="FleetControl.Editors.Views.PropertyEditor">
<UserControl.Resources>
<ResourceDictionary>
<templates:PropertyEditorTemplateSelector x:Key="PropertyEditorTemplateSelector">
<templates:PropertyEditorTemplateSelector.DrillUnitEditorTemplate>
<DataTemplate>
<telerik:RadPropertyGrid
x:Name="DrillPropertyGrid"
behaviours:PersistUiBehavior.FileName="Test1.txt"
behaviours:PersistUiBehavior.PersistanceParentCode="5"
behaviours:PersistUiBehavior.PersistanceChildCode="17"
behaviours:PersistUiBehavior.Name="DrillPropertyGrid">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition DisplayName="Equipment Ident" Binding="{Binding DisplayName, Mode=OneWay}" GroupName="Description" IsReadOnly="True" />
<telerik:PropertyDefinition DisplayName="Equipment Description" Binding="{Binding Description, Mode=OneWay}" GroupName="Description" IsReadOnly="True"/>
<telerik:PropertyDefinition DisplayName="Equipment Type Ident" Binding="{Binding EquipmentType.Ident, Mode=OneWay}" GroupName="Description" IsReadOnly="True"/>
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>
</DataTemplate>
</templates:PropertyEditorTemplateSelector.DrillUnitEditorTemplate>
<templates:PropertyEditorTemplateSelector.FuelTruckUnitEditorTemplate>
<DataTemplate>
<telerik:RadPropertyGrid
x:Name="FuelTruckUnitPropertyGrid"
behaviours:PersistUiBehavior.FileName="Test2.txt"
behaviours:PersistUiBehavior.PersistanceParentCode="6"
behaviours:PersistUiBehavior.PersistanceChildCode="18"
behaviours:PersistUiBehavior.Name="FuelTruckUnitPropertyGrid">
<telerik:RadPropertyGrid.PropertyDefinitions>
<telerik:PropertyDefinition DisplayName="Location" Binding="{Binding Location.LocationName, Mode=OneWay}" GroupName="Realtime" IsReadOnly="True"/>
<telerik:PropertyDefinition DisplayName="Location Code" Binding="{Binding Location.Code, Mode=OneWay}" GroupName="Realtime" IsReadOnly="True"/>
<telerik:PropertyDefinition DisplayName="Location Description" Binding="{Binding Location.Description, Mode=OneWay}" GroupName="Realtime" IsReadOnly="True"/>
</telerik:RadPropertyGrid.PropertyDefinitions>
</telerik:RadPropertyGrid>
</DataTemplate>
</templates:PropertyEditorTemplateSelector.FuelTruckUnitEditorTemplate>
</templates:PropertyEditorTemplateSelector>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentControl
ContentTemplateSelector="{StaticResource PropertyEditorTemplateSelector}"
Content="{Binding Path=SelectedPropertyEditor, Mode=OneWay}" />
</Grid>
</UserControl>
【问题讨论】: