自定义控件IconUC
具有属性IconType
。它用于显示具有名为IsProvider
的属性的视图模型的一部分。在使用IconUC
的DataTemplate中,我使用样式触发器在IconType
为IsProvider
时尝试更改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如何使用它。