2017-11-30 6 views
0

을 클릭하십시오. 클릭 한 항목의 세부 정보를 ListView에 표시하면 클릭 한 항목이 런타임에 콘텐츠로 설정됩니다. 컨트롤의 DataContext, 그리고 내가 Datacontext가 업데이트이 ContentControlDataTemplate 모든 시간을 변경하는 방법을 알고 기꺼이에서, DataContextDataTemplateSelector 만의 값에 따라, 템플릿은 한 번만 설정하고 때 DataContext 변경, 초기 템플릿 고소 된 경우 업데이트되지 않습니다. 그래서 VisualTriggers을 사용하여 진행하기로 결정했는데,이 방법을 사용하면 DataTemplate이 표시되지 않기 때문에이 방법도 작동하지 않는 것으로 보입니다. 이 내가 DataTriggers 사용하는 경우 내 코드입니다 : 나는 DataTemplate 변화 everytimeDataContext 설정 값이 "Uno" 또는 "Duo" 이 도와주세요 값의 속성 Type을 가지고 있는지 확인하고자하는런타임시 ContentControl의 DataTemplate을 변경하는 UWP Xaml DataContext의 속성 값에 따라

<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> 

을!, 나는 많은 시도 내가 할 수 있듯이, 그러나 나는 이것을위한 해결책을 찾을 수 없다.

나는 그것은 당신이 잘못된 방향으로가는 것 같다 지정 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); 
    } 
} 

답변

0

를 사용합니다.

변경된 속성에 따라 템플릿이 변경됩니다.

여기서 무엇을 의미하는지 잘 모르겠습니다. DataContextChanged는 데이터 인터페이스를 전환한다는 것을 의미합니다. 하지만 여기서 당신은 재산 가치에 따라 물건을 바꾸고 싶습니다. 바로 이것입니까?

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> 
    
    1. 은 DataTemplateSelector를 만듭니다

      다음 단계로 무언가를 시도

      모델에서 설정 한 값에 따라 템플릿이 달라집니다.

    +0

    감사합니다. 내가 그것을 시도하자. –

    +0

    감사합니다. 그러나 이것은 DataTemplate을 한 번만 설정합니다. datacontext가 변경되면 런타임에 dataTemplate을 동적으로 변경하려고합니다. –