C#-Silverlight-ItemControl,条件项模板

C#-Silverlight-ItemControl,条件项模板,c#,silverlight,data-binding,C#,Silverlight,Data Binding,我有一个绑定到observateCollection的项目控制器。 我遇到了一个问题,当只有一个用户时,我想显示一个不同的ItemTemplate(例如,仅显示评级-并对所有其他内容使用默认值),如果有更多的用户,我想让人们编辑更多关于他们的信息-组合框等 我认为可能有一种使用转换器的方法,但是我不确定如何使用转换器来选择其中一种。到目前为止,我已经成功地编写了一个转换器来隐藏/显示两个独立的ItemControls,该转换器在observateCollection属性的Count上是可靠的。然

我有一个绑定到
observateCollection
的项目控制器。 我遇到了一个问题,当只有一个用户时,我想显示一个不同的
ItemTemplate
(例如,仅显示评级-并对所有其他内容使用默认值),如果有更多的用户,我想让人们编辑更多关于他们的信息-组合框等

我认为可能有一种使用转换器的方法,但是我不确定如何使用转换器来选择其中一种。到目前为止,我已经成功地编写了一个转换器来隐藏/显示两个独立的
ItemControl
s,该转换器在
observateCollection属性的
Count
上是可靠的。然而,我不认为这是解决这个问题的最好办法


有更好的方法解决这个问题吗?

我认为您只需要一个ItemsControl

您可以通过相同的转换器将计数绑定到组合框等的可见性

你可能只需要这样的东西

<ComboBox Visibility={Binding DataContext.Count, ElementName=LayoutRoot, Converter={StaticResource YourConverter}}/>

您只需要一个带有模板选择的Items控件:

 <ItemsControl ItemsSource="{Binding Users}" ItemTemplate="{Binding Users.Count, Converter={StaticResource UserTemplateSelector}"/>

伟大的但是,到目前为止,它仍然有效,因为我的视图中有我的
DataTemplate
s(
UserControl.Resources
)。所以我需要通过访问称为转换器的视图来找到模板。这可能吗?当我尝试用UserManagementView类实例化一个变量并从中访问资源时,第二次调用转换器时,我得到“树中已存在名称:MultipleUserTemplate。这是因为我没有通过已经创建的对象访问视图吗?这是我已经在做的,但是如果需求更改,这将变得太混乱,无法使用。您可以始终创建两个面板,例如网格,一个包含一些控件,另一个包含一些其他控件。而这只会限制它们的可见性。你不需要一个模板selectorYup,这是我目前得到的。根据不同的标准制定数据模板似乎是一种更好的方法。我还可以用它做其他事情。
    public class UserTemplateSelector : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int userCount = (int) value;
            if (userCount == 1)
            {
                return (DataTemplate) Application.Current.Resources["SingleUserTemplate"]; //SingleUserTemplate should be created e.g. in App.xaml
            }

            return (DataTemplate)Application.Current.Resources["MultipleUserTemplate"]; //MultipleUserTemplate should be created e.g. in App.xaml
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }