DataTriggers行为奇怪

时间:2017-01-19 18:07:16

标签: wpf datatemplate datatrigger

简而言之:

自定义控件IconUC具有属性IconType。它用于显示具有名为IsProvider的属性的视图模型的一部分。在使用IconUC的DataTemplate中,我使用样式触发器在IconTypeIsProvider时尝试更改true的值。

这似乎不起作用,因为IconType的不同值会导致IconUC中显示不同的矢量图形,并且我总是看到相同的图形。

详细说明:

我是WPF的新手,他的任务是对现有应用程序进行一些更改。在过去的三个月里,我做得非常好,但我对这个特殊问题感到困惑。

现有方案是应用程序具有联系人列表。列表中的每个名称前面都会显示一个矢量图形。但是,联系人可以上传自己的照片,在这种情况下,应该显示照片而不是矢量图形。自定义照片通过<ContentPresenter>呈现。矢量图形通过继承自UserControl的IconUC控件呈现。它实现了一个IconType属性,指示要渲染的矢量图形。 <DataTemplate.Triggers>通过将每个控件上的Visible属性设置为Collapsed或Visible来控制是显示矢量图形还是自定义照片。这对于前一个场景一直很好,但现在我被要求做一些改变。到目前为止,一旦加载了联系人列表,IconType就不会改变。

现在将有两个列表显示为选项卡式面板,两个列表都由同一控件呈现。一个列表是针对患者的,另一个列表是针对护理提供者的。我有两个列表应该出现。另一个变化是,当没有提供自定义照片时,有两种可能的矢量图形显示,一种显示在患者姓名前面,另一种显示在提供者名称前面。这是事情变得奇怪的地方。当用户从一个列表导航到另一个列表时,我需要更改IconType的值。为此,我为IconUC控件设置了<Style.Triggers>。我创建了一个属性IsProvider,我将触发器绑定到。当我离开IconUC Visibility属性时,这个工作正常。 IconUC控件会覆盖ContentPresenter控件,因此不会显示自定义照片。如果我在IconUC上将Visibility属性的值设置为Collapsed,则自定义照片显示为他们应该的样子,但即使IsProvider属性返回“true”,IconUC也始终显示患者矢量图形。

我已经验证了每个联系人都执行了IsProvider属性,无论它们出现在哪个列表中,因此IconType属性已设置,但在渲染完成时不会反映出来。

DataTemplate的DataTriggers仍可正常用于更改两个控件的可见性。

这一切都发生在DataTemplate中,由一个由视图使用的Dictionary使用。

如果有人可以帮助我理解如何解决这个问题,我们将不胜感激。

以下是DataTemplate中的XAML:

    <DataTemplate x:Key="ContactListItemDT">
    <Border BorderBrush="{DynamicResource CallListBorderBrush}" BorderThickness="0,0,0,1">
        <Grid Height="40" Margin="4" IsHitTestVisible="True" Background="Transparent">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="8"/>
            </Grid.ColumnDefinitions>
            <Grid Visibility="{Binding EnabledSettings.IsPhotoVisible, Converter={MarkupExtensions:BooleanToVisibilityConverter}}">
                <ContentPresenter x:Name="CustomPhoto" Content="{Binding ContactRepresentative.Photo}" />
                <UserControls:IconUC x:Name="DefaultPhoto" 
                                 Background="{DynamicResource ThemeSilhouetteBackground}" 
                                 Foreground="{DynamicResource ThemeSilhouetteForeground}"
                                 Visibility="Collapsed">
                    <UserControls:IconUC.Style>
                        <Style TargetType="{x:Type UserControls:IconUC}">
                            <Setter Property="IconType" Value="Patient"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=IsProvider}" Value="True">
                                    <Setter Property="IconType" Value="Provider"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </UserControls:IconUC.Style>
                </UserControls:IconUC>
            </Grid>
            <TextBlock Name="DisplayName" Text="{Binding DisplayName}" Grid.Column="1" VerticalAlignment="Top" Padding="8,0,0,0" Style="{DynamicResource ThemeListItemTextBlockStyle}" FontFamily="Segoe UI Bold" FontSize="14"/>
            <TextBlock Name="DisplayDialString" Text="{Binding FormattedDialString}" Grid.Column="1" VerticalAlignment="Bottom" Padding="20,0,0,2" FontFamily="Segoe UI" FontSize="12" Style="{DynamicResource ThemeLightListItemTextBlockStyle}"/>
        </Grid>
    </Border>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding ContactRepresentative}" Value="{x:Null}">
            <Setter TargetName="CustomPhoto" Property="Visibility" Value="Collapsed" />
            <Setter TargetName="DefaultPhoto" Property="Visibility" Value="Visible" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

这是IconUC类:

public partial class IconUC : UserControl
{
    public IconUC()
    {
        InitializeComponent();
    }

    public IconTypes IconType
    {
        get
        {
            return (IconTypes)GetValue(IconTypeProperty);
        }
        set
        {
            SetValue(IconTypeProperty, value);
        }
    }

    // Using a DependencyProperty as the backing store for IconType.  This enables animation, styling, binding, etc...
    public static DependencyProperty IconTypeProperty =
        DependencyProperty.Register("IconType", typeof(IconTypes), typeof(IconUC), new PropertyMetadata(IconTypes.Add, OnIconTypeChanged));

    private static void OnIconTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        IconTypes iconType = (IconTypes)e.NewValue;
        IconUC iconUC = (IconUC)d;
        iconUC.Template = (ControlTemplate)iconUC.Resources[iconType.ToString() + "IconCT"];
    }



    public double OutlineThickness
    {
        get { return (double)GetValue(OutlineThicknessProperty); }
        set { SetValue(OutlineThicknessProperty, value); }
    }

    // Using a DependencyProperty as the backing store for OutlineThickness.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty OutlineThicknessProperty =
        DependencyProperty.Register("OutlineThickness", typeof(double), typeof(IconUC), new PropertyMetadata(0d));


}

IsProvider在名为CallListItemVM.cs的视图模型中定义:

        public bool IsProvider
    {
        get
        {
            var callListItem = Managers.CallListManager.Instance.ContactList.FirstOrDefault((x) => { return x.DialString.Equals(dialString); });

            return String.Compare(((PhonebookContactVM)callListItem)?.CompanyName, "P", StringComparison.OrdinalIgnoreCase) != 0;

        }
    }

可悲的是,为了识别病人,包含“P”的CompanyName是我必须暂时忍受的黑客行为。我们受限于向数据库添加字段。

我发现的另一件事是在IconSettingsVM类中定义了Silhouette属性。如果我更改了引用的IconType,它会更改没有自定义照片时显示的矢量图形:

        public static IconSettingsVM Silhouette
    {
        get
        {
            return new IconSettingsVM(Views.Enumerations.IconTypes.Provider, "ThemeSilhouetteForeground", "ThemeSilhouetteBackground");
        }
    }

但这对你没有多大帮助。此Silhouette属性在多个位置使用,但我无法直接关联此DataTemplate如何使用它。

0 个答案:

没有答案