在XAML中动态切换ItemsSource

时间:2014-07-13 20:55:39

标签: wpf xaml mvvm

我正在尝试根据viewmodel中属性的值切换树视图的itemssource。我已经尝试了下面的代码并且触发器似乎没有触发,有人可以告诉我哪里出错了吗?

<Window.Resources>  
<Style x:Key="TreeViewItemSource" TargetType="TreeView"> 
       <Style.Triggers>                
            <DataTrigger Binding="{Binding CurrentReportRequested, Mode=TwoWay,     UpdateSourceTrigger=PropertyChanged}" Value="TollFree">
                <Setter Property="ItemsSource" Value="{Binding InsertTFSQueryList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />                        
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<TreeView ItemsSource="{Binding Source={StaticResource TreeViewItemSource},  UpdateSourceTrigger=PropertyChanged,  Converter={StaticResource DebugConverter}}" />

2 个答案:

答案 0 :(得分:2)

在Style中设置 ItemsSource ,否则本地设置值将始终保持优先级。

在此处阅读更多相关信息 - Dependency Property Value Precedence Order

<Style x:Key="TreeViewItemSource" TargetType="TreeView"> 
   <!-- Set ItemsSource here but you need to separate Style out of it. -->
   <Setter Property="ItemsSource"
           Value="{Binding Source={StaticResource TreeViewItemSource}, 
                           UpdateSourceTrigger=PropertyChanged, 
                           Converter={StaticResource DebugConverter}}"/>
   <Style.Triggers>                
      <DataTrigger Binding="{Binding CurrentReportRequested, Mode=TwoWay,
                                     UpdateSourceTrigger=PropertyChanged}"
                   Value="TollFree">
         <Setter Property="ItemsSource" Value="{Binding InsertTFSQueryList,
                        Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>  
     </DataTrigger>
   </Style.Triggers>
</Style>

最重要的是,您已将ItemsSource设置为Style,并将其设置为转换器中的某个位置,您将其转换为实际值。这是我看过的最奇怪的事情。样式如何可转换为ItemsSource。重构逻辑并将两者分开,以便上面的XAML适合你。

答案 1 :(得分:1)

为了解决我的问题,我使用了古老的oop ...多态性。

我在ViewModel中使用了多态结构。现在我的ItemsSource绑定到一个IEnumerable列表,该列表包含基类...我可以将其等同于任何派生类型。