Is it possible to have a DataTemplate around another DataTemplate?











up vote
1
down vote

favorite












Hello everyone and welcome to yet another nested DataTemplate question!



In this one, I'd like to have a DataTemplate like this, written on a ResourceDictionary:



<DataTemplate x:Key="Vector3Template">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="X" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding X}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Y" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Y}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Z" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Z}"/>
</StackPanel>
</StackPanel>
</DataTemplate>


Being surrounded by a DataTemplate with a border, like the following, also written on a ResourceDictionary (in the future it's gonna have a couple more elements to it):



<DataTemplate x:Key="ComponentTemplate">
<Border Margin="5" BorderThickness="2" BorderBrush="Gray"/>
</DataTemplate>


Why would I want this, you ask? Well, I'm trying to display an ObservableCollection of IComponent named _components and I want all instances to share the same Borders, but with its core being specific to every class type that inherits from IComponent.



In order to display the list with its differents type, I'm using the following code on a UserControl:



<Grid x:Name="LayoutRoot" Background="White">        
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel>
<ListView x:Name="_componentsList"
ItemsSource="{Binding Components}"
HorizontalContentAlignment="Stretch">
<ListView.Resources>
<DataTemplate DataType="{x:Type models:Transform}">
<ContentControl Content="{StaticResource ComponentTemplate}" ContentTemplate="{StaticResource TransformTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type models:Vector3}">
<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>
</DataTemplate>
</ListView.Resources>
</ListView>
</StackPanel>
</ScrollViewer>




Trying to build this system with Prism 6.3 and with almost no code-behind, every c# code that I have is just for models, so no real logic here so far.



Is this possible? How so? I've started playing with WPF a few days ago and still have a lot to learn.










share|improve this question


















  • 1




    "share the same Borders" by a ControlTemplate set by a Style Setter of the Template property in the ItemContainerStyle of an ItemsControl. Put a ContenPresenter in the Border in the ControlTemplate. Besides that, a ListView in a StackPanel in a ScrollViewer looks odd. A ListView already supports scrolling.
    – Clemens
    Nov 14 at 21:32












  • Somehow setting VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Doesn't work.. I either get a disable verticalScroll or no verticalScroll at all But you are absolutely right, setting ItemContainerStyle did work
    – Trmotta
    Nov 14 at 22:32












  • This question asks about a XY problem... you think that DataTemplate is the way to do what you want, but what you want is a common templated container (it's purely visual, not data dependent) with a specialized templated content area for the data (display data = DataTemplate). In short: nested DataTemplate is not what you are looking for. You should write your question around your actual requirements and only mention your thoughts about possible solutions, instead of writing the question about possible solutions and only mentioning the actual problem to be solved.
    – grek40
    Nov 22 at 21:20

















up vote
1
down vote

favorite












Hello everyone and welcome to yet another nested DataTemplate question!



In this one, I'd like to have a DataTemplate like this, written on a ResourceDictionary:



<DataTemplate x:Key="Vector3Template">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="X" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding X}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Y" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Y}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Z" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Z}"/>
</StackPanel>
</StackPanel>
</DataTemplate>


Being surrounded by a DataTemplate with a border, like the following, also written on a ResourceDictionary (in the future it's gonna have a couple more elements to it):



<DataTemplate x:Key="ComponentTemplate">
<Border Margin="5" BorderThickness="2" BorderBrush="Gray"/>
</DataTemplate>


Why would I want this, you ask? Well, I'm trying to display an ObservableCollection of IComponent named _components and I want all instances to share the same Borders, but with its core being specific to every class type that inherits from IComponent.



In order to display the list with its differents type, I'm using the following code on a UserControl:



<Grid x:Name="LayoutRoot" Background="White">        
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel>
<ListView x:Name="_componentsList"
ItemsSource="{Binding Components}"
HorizontalContentAlignment="Stretch">
<ListView.Resources>
<DataTemplate DataType="{x:Type models:Transform}">
<ContentControl Content="{StaticResource ComponentTemplate}" ContentTemplate="{StaticResource TransformTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type models:Vector3}">
<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>
</DataTemplate>
</ListView.Resources>
</ListView>
</StackPanel>
</ScrollViewer>




Trying to build this system with Prism 6.3 and with almost no code-behind, every c# code that I have is just for models, so no real logic here so far.



Is this possible? How so? I've started playing with WPF a few days ago and still have a lot to learn.










share|improve this question


















  • 1




    "share the same Borders" by a ControlTemplate set by a Style Setter of the Template property in the ItemContainerStyle of an ItemsControl. Put a ContenPresenter in the Border in the ControlTemplate. Besides that, a ListView in a StackPanel in a ScrollViewer looks odd. A ListView already supports scrolling.
    – Clemens
    Nov 14 at 21:32












  • Somehow setting VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Doesn't work.. I either get a disable verticalScroll or no verticalScroll at all But you are absolutely right, setting ItemContainerStyle did work
    – Trmotta
    Nov 14 at 22:32












  • This question asks about a XY problem... you think that DataTemplate is the way to do what you want, but what you want is a common templated container (it's purely visual, not data dependent) with a specialized templated content area for the data (display data = DataTemplate). In short: nested DataTemplate is not what you are looking for. You should write your question around your actual requirements and only mention your thoughts about possible solutions, instead of writing the question about possible solutions and only mentioning the actual problem to be solved.
    – grek40
    Nov 22 at 21:20















up vote
1
down vote

favorite









up vote
1
down vote

favorite











Hello everyone and welcome to yet another nested DataTemplate question!



In this one, I'd like to have a DataTemplate like this, written on a ResourceDictionary:



<DataTemplate x:Key="Vector3Template">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="X" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding X}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Y" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Y}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Z" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Z}"/>
</StackPanel>
</StackPanel>
</DataTemplate>


Being surrounded by a DataTemplate with a border, like the following, also written on a ResourceDictionary (in the future it's gonna have a couple more elements to it):



<DataTemplate x:Key="ComponentTemplate">
<Border Margin="5" BorderThickness="2" BorderBrush="Gray"/>
</DataTemplate>


Why would I want this, you ask? Well, I'm trying to display an ObservableCollection of IComponent named _components and I want all instances to share the same Borders, but with its core being specific to every class type that inherits from IComponent.



In order to display the list with its differents type, I'm using the following code on a UserControl:



<Grid x:Name="LayoutRoot" Background="White">        
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel>
<ListView x:Name="_componentsList"
ItemsSource="{Binding Components}"
HorizontalContentAlignment="Stretch">
<ListView.Resources>
<DataTemplate DataType="{x:Type models:Transform}">
<ContentControl Content="{StaticResource ComponentTemplate}" ContentTemplate="{StaticResource TransformTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type models:Vector3}">
<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>
</DataTemplate>
</ListView.Resources>
</ListView>
</StackPanel>
</ScrollViewer>




Trying to build this system with Prism 6.3 and with almost no code-behind, every c# code that I have is just for models, so no real logic here so far.



Is this possible? How so? I've started playing with WPF a few days ago and still have a lot to learn.










share|improve this question













Hello everyone and welcome to yet another nested DataTemplate question!



In this one, I'd like to have a DataTemplate like this, written on a ResourceDictionary:



<DataTemplate x:Key="Vector3Template">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="X" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding X}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Y" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Y}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Z" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Z}"/>
</StackPanel>
</StackPanel>
</DataTemplate>


Being surrounded by a DataTemplate with a border, like the following, also written on a ResourceDictionary (in the future it's gonna have a couple more elements to it):



<DataTemplate x:Key="ComponentTemplate">
<Border Margin="5" BorderThickness="2" BorderBrush="Gray"/>
</DataTemplate>


Why would I want this, you ask? Well, I'm trying to display an ObservableCollection of IComponent named _components and I want all instances to share the same Borders, but with its core being specific to every class type that inherits from IComponent.



In order to display the list with its differents type, I'm using the following code on a UserControl:



<Grid x:Name="LayoutRoot" Background="White">        
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel>
<ListView x:Name="_componentsList"
ItemsSource="{Binding Components}"
HorizontalContentAlignment="Stretch">
<ListView.Resources>
<DataTemplate DataType="{x:Type models:Transform}">
<ContentControl Content="{StaticResource ComponentTemplate}" ContentTemplate="{StaticResource TransformTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type models:Vector3}">
<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>
</DataTemplate>
</ListView.Resources>
</ListView>
</StackPanel>
</ScrollViewer>




Trying to build this system with Prism 6.3 and with almost no code-behind, every c# code that I have is just for models, so no real logic here so far.



Is this possible? How so? I've started playing with WPF a few days ago and still have a lot to learn.







wpf prism datatemplate resourcedictionary contentcontrol






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 14 at 21:24









Trmotta

12829




12829








  • 1




    "share the same Borders" by a ControlTemplate set by a Style Setter of the Template property in the ItemContainerStyle of an ItemsControl. Put a ContenPresenter in the Border in the ControlTemplate. Besides that, a ListView in a StackPanel in a ScrollViewer looks odd. A ListView already supports scrolling.
    – Clemens
    Nov 14 at 21:32












  • Somehow setting VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Doesn't work.. I either get a disable verticalScroll or no verticalScroll at all But you are absolutely right, setting ItemContainerStyle did work
    – Trmotta
    Nov 14 at 22:32












  • This question asks about a XY problem... you think that DataTemplate is the way to do what you want, but what you want is a common templated container (it's purely visual, not data dependent) with a specialized templated content area for the data (display data = DataTemplate). In short: nested DataTemplate is not what you are looking for. You should write your question around your actual requirements and only mention your thoughts about possible solutions, instead of writing the question about possible solutions and only mentioning the actual problem to be solved.
    – grek40
    Nov 22 at 21:20
















  • 1




    "share the same Borders" by a ControlTemplate set by a Style Setter of the Template property in the ItemContainerStyle of an ItemsControl. Put a ContenPresenter in the Border in the ControlTemplate. Besides that, a ListView in a StackPanel in a ScrollViewer looks odd. A ListView already supports scrolling.
    – Clemens
    Nov 14 at 21:32












  • Somehow setting VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Doesn't work.. I either get a disable verticalScroll or no verticalScroll at all But you are absolutely right, setting ItemContainerStyle did work
    – Trmotta
    Nov 14 at 22:32












  • This question asks about a XY problem... you think that DataTemplate is the way to do what you want, but what you want is a common templated container (it's purely visual, not data dependent) with a specialized templated content area for the data (display data = DataTemplate). In short: nested DataTemplate is not what you are looking for. You should write your question around your actual requirements and only mention your thoughts about possible solutions, instead of writing the question about possible solutions and only mentioning the actual problem to be solved.
    – grek40
    Nov 22 at 21:20










1




1




"share the same Borders" by a ControlTemplate set by a Style Setter of the Template property in the ItemContainerStyle of an ItemsControl. Put a ContenPresenter in the Border in the ControlTemplate. Besides that, a ListView in a StackPanel in a ScrollViewer looks odd. A ListView already supports scrolling.
– Clemens
Nov 14 at 21:32






"share the same Borders" by a ControlTemplate set by a Style Setter of the Template property in the ItemContainerStyle of an ItemsControl. Put a ContenPresenter in the Border in the ControlTemplate. Besides that, a ListView in a StackPanel in a ScrollViewer looks odd. A ListView already supports scrolling.
– Clemens
Nov 14 at 21:32














Somehow setting VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Doesn't work.. I either get a disable verticalScroll or no verticalScroll at all But you are absolutely right, setting ItemContainerStyle did work
– Trmotta
Nov 14 at 22:32






Somehow setting VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Doesn't work.. I either get a disable verticalScroll or no verticalScroll at all But you are absolutely right, setting ItemContainerStyle did work
– Trmotta
Nov 14 at 22:32














This question asks about a XY problem... you think that DataTemplate is the way to do what you want, but what you want is a common templated container (it's purely visual, not data dependent) with a specialized templated content area for the data (display data = DataTemplate). In short: nested DataTemplate is not what you are looking for. You should write your question around your actual requirements and only mention your thoughts about possible solutions, instead of writing the question about possible solutions and only mentioning the actual problem to be solved.
– grek40
Nov 22 at 21:20






This question asks about a XY problem... you think that DataTemplate is the way to do what you want, but what you want is a common templated container (it's purely visual, not data dependent) with a specialized templated content area for the data (display data = DataTemplate). In short: nested DataTemplate is not what you are looking for. You should write your question around your actual requirements and only mention your thoughts about possible solutions, instead of writing the question about possible solutions and only mentioning the actual problem to be solved.
– grek40
Nov 22 at 21:20














1 Answer
1






active

oldest

votes

















up vote
0
down vote













I believe what you're looking for is to simply use a DataTemplateSelector in which the DataTemplate used is determined by the data. You can find a full tutorial here. Once you've setup your DataTemplateSelector you simply would pass it in as the DataTemplate to your control.



public class PropertyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultnDataTemplate { get; set; }
public DataTemplate BooleanDataTemplate { get; set; }
public DataTemplate EnumDataTemplate { get; set; }

public override DataTemplate SelectTemplate(object item,
DependencyObject container)
{
DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
if (dpi.PropertyType == typeof(bool))
{
return BooleanDataTemplate;
}
if (dpi.PropertyType.IsEnum)
{
return EnumDataTemplate;
}

return DefaultnDataTemplate;
}
}





share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53308934%2fis-it-possible-to-have-a-datatemplate-around-another-datatemplate%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote













    I believe what you're looking for is to simply use a DataTemplateSelector in which the DataTemplate used is determined by the data. You can find a full tutorial here. Once you've setup your DataTemplateSelector you simply would pass it in as the DataTemplate to your control.



    public class PropertyDataTemplateSelector : DataTemplateSelector
    {
    public DataTemplate DefaultnDataTemplate { get; set; }
    public DataTemplate BooleanDataTemplate { get; set; }
    public DataTemplate EnumDataTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item,
    DependencyObject container)
    {
    DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
    if (dpi.PropertyType == typeof(bool))
    {
    return BooleanDataTemplate;
    }
    if (dpi.PropertyType.IsEnum)
    {
    return EnumDataTemplate;
    }

    return DefaultnDataTemplate;
    }
    }





    share|improve this answer

























      up vote
      0
      down vote













      I believe what you're looking for is to simply use a DataTemplateSelector in which the DataTemplate used is determined by the data. You can find a full tutorial here. Once you've setup your DataTemplateSelector you simply would pass it in as the DataTemplate to your control.



      public class PropertyDataTemplateSelector : DataTemplateSelector
      {
      public DataTemplate DefaultnDataTemplate { get; set; }
      public DataTemplate BooleanDataTemplate { get; set; }
      public DataTemplate EnumDataTemplate { get; set; }

      public override DataTemplate SelectTemplate(object item,
      DependencyObject container)
      {
      DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
      if (dpi.PropertyType == typeof(bool))
      {
      return BooleanDataTemplate;
      }
      if (dpi.PropertyType.IsEnum)
      {
      return EnumDataTemplate;
      }

      return DefaultnDataTemplate;
      }
      }





      share|improve this answer























        up vote
        0
        down vote










        up vote
        0
        down vote









        I believe what you're looking for is to simply use a DataTemplateSelector in which the DataTemplate used is determined by the data. You can find a full tutorial here. Once you've setup your DataTemplateSelector you simply would pass it in as the DataTemplate to your control.



        public class PropertyDataTemplateSelector : DataTemplateSelector
        {
        public DataTemplate DefaultnDataTemplate { get; set; }
        public DataTemplate BooleanDataTemplate { get; set; }
        public DataTemplate EnumDataTemplate { get; set; }

        public override DataTemplate SelectTemplate(object item,
        DependencyObject container)
        {
        DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
        if (dpi.PropertyType == typeof(bool))
        {
        return BooleanDataTemplate;
        }
        if (dpi.PropertyType.IsEnum)
        {
        return EnumDataTemplate;
        }

        return DefaultnDataTemplate;
        }
        }





        share|improve this answer












        I believe what you're looking for is to simply use a DataTemplateSelector in which the DataTemplate used is determined by the data. You can find a full tutorial here. Once you've setup your DataTemplateSelector you simply would pass it in as the DataTemplate to your control.



        public class PropertyDataTemplateSelector : DataTemplateSelector
        {
        public DataTemplate DefaultnDataTemplate { get; set; }
        public DataTemplate BooleanDataTemplate { get; set; }
        public DataTemplate EnumDataTemplate { get; set; }

        public override DataTemplate SelectTemplate(object item,
        DependencyObject container)
        {
        DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
        if (dpi.PropertyType == typeof(bool))
        {
        return BooleanDataTemplate;
        }
        if (dpi.PropertyType.IsEnum)
        {
        return EnumDataTemplate;
        }

        return DefaultnDataTemplate;
        }
        }






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 22 at 16:50









        Dan S.

        2,9562620




        2,9562620






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53308934%2fis-it-possible-to-have-a-datatemplate-around-another-datatemplate%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Trompette piccolo

            How do I get these specific pathlines to nodes?

            What visual should I use to simply compare current year value vs last year in Power BI desktop