[英]Change datatemplate of contentcontrol on change of datacontext property
[英]UWP Xaml, changing ContentControl's DataTemplate at runtime, Depending on the value of a property on its DataContext's
请给我一个ContentControl
,它显示在ListView
上单击的项的详细信息,在运行时将单击的项设置为Content控件的DataContext
,并且我想知道每次Datacontext
更改此ContentControl
的DataTemplate
的方法。更新,取决于DataContext
的值是DataTemplateSelector
但是模板仅设置一次,并且当DataContext
更改时,此初始模板不会被更新。 因此,我决定继续使用VisualTriggers
,但这似乎也不起作用,因为当我使用这种方法时, DataTemplate
甚至都不会显示。 这是我使用DataTriggers时的代码:
<ContentControl x:Name="baseTemplate" DataContext="{Binding Selected}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Uno">
<VisualState.StateTriggers>
<dataTriggers:FocusDataTrigger
dataTriggers:FocusDataTrigger.TriggerValue="Uno"
dataTriggers:FocusDataTrigger.DataValue="{Binding DataContext.Type}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="baseTemplate.Template" Value="{StaticResource UnoTemplate}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Duo">
<VisualState.StateTriggers>
<dataTriggers:FocusDataTrigger
dataTriggers:FocusDataTrigger.TriggerValue="Duo"
dataTriggers:FocusDataTrigger.DataValue="{Binding DataContext.Type}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="baseTemplate.Template" Value="{StaticResource detailTemplateSelector}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</ContentControl>
我希望everytime
设置为DataContext
的值具有属性Type
为"Uno"
或"Duo"
的值时都可以更改DataTemplate
请帮忙!,我已经尽力了,但是我找不到解决方案。
我使用自定义DataTrigger
public class FocusDataTrigger : StateTriggerBase
{
#region DataValue
public static readonly DependencyProperty DataValueProperty =
DependencyProperty.RegisterAttached("DataValue", typeof(object),
typeof(FocusDataTrigger), new PropertyMetadata(null, DataValueChanged));
public static object GetDataValue(DependencyObject obj)
{
return obj.GetValue(DataValueProperty);
}
public static void SetDataValue(DependencyObject obj, object value)
{
obj.SetValue(DataValueProperty, value);
}
#endregion
#region TriggerValue
public static readonly DependencyProperty TriggerValueProperty =
DependencyProperty.RegisterAttached("TriggerValue", typeof(object),
typeof(FocusDataTrigger), new PropertyMetadata(false, TriggerValueChanged));
public static object GetTriggerValue(DependencyObject obj)
{
return obj.GetValue(TriggerValueProperty);
}
public static void SetTriggerValue(DependencyObject obj, object value)
{
obj.SetValue(TriggerValueProperty, value);
}
#endregion
private static void TriggerStateCheck(DependencyObject target, object datavalue, object triggerValue)
{
FocusDataTrigger trigger = target as FocusDataTrigger;
if (trigger == null) return;
trigger.SetActive(triggerValue == datavalue);
}
private static void TriggerValueChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
object datavalue = target.GetValue(FocusDataTrigger.DataValueProperty);
TriggerStateCheck(target, datavalue, e.NewValue);
}
private static void DataValueChanged(DependencyObject target,
DependencyPropertyChangedEventArgs e)
{
object triggerValue = target.GetValue(FocusDataTrigger.TriggerValueProperty);
TriggerStateCheck(target, e.NewValue, triggerValue);
}
}
看来您走错了方向。
您的模板将根据更改的属性而更改。
我不太确定你在这里的意思。 DataContextChanged意味着您正在切换数据上下文。 但是似乎您只是想根据属性值更改某些东西,我是否正确?
请尝试执行以下步骤:
创建一个DataTemplateSelector:
public class CCDataTemplateSelector: DataTemplateSelector { public DataTemplate FirstTemplate { get; set; } public DataTemplate SecondTemplate { get; set; } protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { var model = item as DemoModel; if (model == null) return null; if (model.ID >= 2) return FirstTemplate; else return SecondTemplate; } }
然后,在您的XAML中,您可以编写如下内容:
<StackPanel.Resources> <DataTemplate x:Key="FirstTemplate"> xxxxx </DataTemplate> <DataTemplate x:Key="SecondTemplate"> xxxxx </DataTemplate> <local:CCDataTemplateSelector FirstTemplate="{StaticResource FirstTemplate}" SecondTemplate="{StaticResource SecondTemplate}" x:Key="DataTemplateSelector" /> <Style TargetType="ContentControl"> <Setter Property="ContentTemplateSelector" Value="{StaticResource DataTemplateSelector}" /> </Style> </StackPanel.Resources>
这样,模板将根据您在模型中设置的值而有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.