相关疑难解决方法(0)

WPF:当某个值更改时重新应用DataTemplateSelector

所以这是我拥有的XAML:

<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>
Run Code Online (Sandbox Code Playgroud)

这是我的ListTemplateSelector类:

public class ListTemplateSelector : DataTemplateSelector {
public DataTemplate GroupTemplate { get; set; }
public DataTemplate ItemTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
    GroupList<Person> list = item as GroupList<Person>;
    if (list != null && !list.IsLeaf)
        return GroupTemplate;
    return ItemTemplate;
}
}
Run Code Online (Sandbox Code Playgroud)

GroupTemplate数据模板本身引用了ListTemplateSelector,所以这就是我设置的原因.这是我可以放在一起的唯一递归黑客.但这不是我遇到的问题.

我的问题是,我想在IsLeaf属性更改时从ItemTemplate更改为GroupTemplate.这是第一次读取房产以来的第一次.但是一旦此属性更改,模板选择器就不会重新应用.现在,我可以使用触发器绑定到值并适当地设置项目模板,但我需要能够为每个项目设置不同的模板,因为它们可能处于不同的状态.

例如,假设我有一个像这样的组列表:

第1组:IsLeaf = false,因此template = GroupTemplate

第2组:IsLeaf = true,因此template = ItemTemplate

第3组:IsLeaf = false,因此template = GroupTemplate

一旦组1的IsLeaf属性更改为true,模板就需要自动更改为ItemTemplate.

编辑:

这是我的临时解决方案.有更好的方法吗?

<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate> …
Run Code Online (Sandbox Code Playgroud)

c# wpf binding datatemplateselector

27
推荐指数
2
解决办法
2万
查看次数

ContentTemplateSelector仅被调用一次,始终显示相同的datatemplate

我已经制作了一个示例演示VS 2010 RC示例项目,因为在我的生产项目中我使用MVVM时遇到了同样的错误.

在我的示例演示项目中,我只使用Code-behind而没有第三方依赖,因此您可以在此处下载演示项目并自行运行:http://www.sendspace.com/file/mwx7wv

现在问题:当我点击女孩/男孩按钮时,它应该切换datatemplate,不是吗?

我错了什么?

好的,我在这里也提供了一个代码片段:

代码隐藏在MainWindow.cs:

namespace ContentTemplateSelectorDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Person person;

        public MainWindow()
        {
            InitializeComponent();

            person = new Person(){ Gender = "xxx"};
            person.IsBoy = true;


            ContentGrid.DataContext = person;
        }

        private void btnBoys_Click(object sender, RoutedEventArgs e)
        {
            person.IsBoy = true;
            person.IsGirl = false;
            this.ContentGrid.DataContext = person;
        }

        private void btnGirls_Click(object sender, RoutedEventArgs e)
        {
            person.IsGirl = true;
            person.IsBoy = …
Run Code Online (Sandbox Code Playgroud)

wpf datatemplate contenttemplateselector

7
推荐指数
1
解决办法
9578
查看次数

触发的内容模板

我正在尝试设置一个基于DataTrigger更改的ContentTemplate.从语法上讲,我觉得这应该可行,但在尝试呈现页面时会导致堆栈溢出:

<ItemsControl ItemsSource="{Binding Path=ExtendedFieldCollection}" ItemTemplate="{StaticResource RequiredFieldsTemplate}" />

<!--Where-->
<DataTemplate x:Key="RequiredFieldsTemplate">
    <ContentPresenter>
        <ContentPresenter.Style>
            <Style TargetType="ContentPresenter">
                <Setter Property="ContentTemplate" Value="{x:Null}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsRequired}" Value="True">
                        <Setter Property="ContentTemplate" Value="{StaticResource MyFieldDisplayTemplate}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentPresenter.Style>
    </ContentPresenter>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

简单地说

<DataTemplate x:Key="RequiredFieldsTemplate">
    <ContentPresenter ContentTemplate="{StaticResource MyFieldDisplayTemplate}" />
Run Code Online (Sandbox Code Playgroud)

工作正常 - 但我想要完成的是绑定到字段列表,但只显示必填字段.我不能只使用Visibility = collapsed,实例化中的所有自定义控件都有巨大的开销MyFieldDisplayTemplate.我的目标是让非必需字段在ItemsControl中具有完全不同(空)的控件模板.

有关如何设置此触发器的任何想法?

c# wpf xaml triggers .net-4.0

3
推荐指数
1
解决办法
4908
查看次数