c# - populares - top 100 hashtags on instagram copy and paste




Come attivare DataTemplateSelector quando la proprietà cambia? (2)

Ho ContentPresenter con DataTemplateSelector:

    ...

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var model = item as ItemControlViewModel;

        if (model.CurrentStatus == PrerequisitesStatus.Required)
        {
            return RequiredTemplate;
        }

        if (model.CurrentStatus == PrerequisitesStatus.Completed)
        {
            return FinishedTemplate;
        }

        ...

        return InProgressTemplate;
    }

Quando CurrentStatus viene modificato, viene chiamato OnPropertyChanged.

Ho bisogno in qualche modo di attivare questo DataTemplateSelector quando la proprietà viene modificata e modificare ContentPresenter DataTemplate. Eventuali suggerimenti?

Esistono domande simili: 1 2 , ma non voglio usare alcun DataTrigger, a causa di troppi stati.

Ho cercato di giocare con DataTriggers

    <ContentPresenter
        Grid.Column="1"
        Height="16"
        Width="16"
        Margin="3">
        <ContentPresenter.Triggers>
            <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
                <Setter Property="ContentPresenter.ContentTemplate" Value="{StaticResource ResourceKey=_requiredStatusTemplate}" />
            </DataTrigger>
        </ContentPresenter.Triggers>
    </ContentPresenter>

Ma ho un errore: i membri della collezione Triggers devono essere di tipo EventTrigger :(


Come hai richiesto un esempio con i datatrigger nei commenti, eccoti:

Un FrameworkElement può avere solo EventTriggers, quindi si ottiene il messaggio Errore che i membri della raccolta Trigger devono essere di tipo EventTrigger

Inoltre, non utilizzare direttamente ContentPresenter, è pensato per essere utilizzato all'interno di un ControlTemplate. Meglio usare un ContentControl quando vuoi avere un contenuto dinamico. Vedi Qual è la differenza tra ContentControl e ContentPresenter?

E finalmente ecco un suggerimento per il tuo problema di DataTrigger. L'ho messo dentro uno stile per la riusabilità ....

XAML:

<Window x:Class="WpfApplication88.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>

    <DataTemplate x:Key="requiredTemplate">
      <TextBlock Text="requiredTemplate"></TextBlock>
      <!--your stuff here-->
    </DataTemplate>

    <DataTemplate x:Key="completedTemplate">
      <TextBlock Text="CompletedTemplate"></TextBlock>
      <!--your stuff here-->
    </DataTemplate>

    <Style x:Key="selectableContentStyle" TargetType="{x:Type ContentControl}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Required">
          <Setter Property="ContentTemplate" Value="{StaticResource requiredTemplate}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Completed">
          <Setter Property="ContentTemplate" Value="{StaticResource completedTemplate}" />
        </DataTrigger>
        <!--  your other Status' here -->
      </Style.Triggers>
    </Style>

  </Window.Resources>

  <Grid>
    <ContentControl Width="100" Height="100" Style="{StaticResource selectableContentStyle}"/>
  </Grid>

</Window>

Potrei sbagliarmi, ma credo che DataTemplateSelector venga usato solo quando ItemContainerGenerator crea un contenitore per un oggetto aggiunto alla collezione. Poiché un nuovo contenitore non viene generato quando si modifica un valore della proprietà, non verrà mai applicato un nuovo DataTemplate tramite il selettore.

Come suggerito nei commenti, ti consiglio di guardare VisualStateManager o trigger di dati, altrimenti dovrai ricreare il contenitore per ogni oggetto quando una o più proprietà cambiano valore.







datatemplateselector