是否可以根据Silverlight 4中的可绑定属性动态选择要渲染的控件?

是否可以根据Silverlight 4中的可绑定属性动态选择要渲染的控件?,silverlight,xaml,silverlight-4.0,dynamic-data,Silverlight,Xaml,Silverlight 4.0,Dynamic Data,我有一个带有ItemTemplate的列表框,它呈现一个包含两列的网格。第一列是文本块,第二列是组合框 其思想是向用户呈现一个问题列表和一个组合,用户可以从中选择答案。这适用于此xaml: 在DataTemplate中放置文本框(而不是TextBlock)的原因是,除了从下拉列表中进行选择之外,我还首次尝试允许用户输入自由文本。不过,文本框在组合框内,这是一种工作方式。那不是我想要的 是否可以使用“普通”文本框渲染,而不是基于某个可绑定属性的组合框 因此,如果属性InputType==Fre

我有一个带有ItemTemplate的列表框,它呈现一个包含两列的网格。第一列是文本块,第二列是组合框

其思想是向用户呈现一个问题列表和一个组合,用户可以从中选择答案。这适用于此xaml:


在DataTemplate中放置文本框(而不是TextBlock)的原因是,除了从下拉列表中进行选择之外,我还首次尝试允许用户输入自由文本。不过,文本框在组合框内,这是一种工作方式。那不是我想要的

是否可以使用“普通”文本框渲染,而不是基于某个可绑定属性的组合框

因此,如果属性InputType==FreeText,则视图将使用文本框呈现,如果属性InputType==Combo,则视图将按上述方式呈现


t、

针对您的特定问题,一个简单的解决方案是在可见性属性上同时包含这两个选项并使用值转换器:-

public class EqualityToValueConverter<T> : IValueConverter
{
    public T FalseValue { get; set; }
    public T TrueValue { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return value.ToString().Equals(parameter) ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null && value.Equals(TrueValue) ? parameter : null;
    }
}

public class EqualityToVisibilityConverter : EqualityToValueConverter<Visibility> { }
公共类EqualityToValueConverter:IValueConverter
{
公共T值{get;set;}
公共T TrueValue{get;set;}
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
如果(值==null)
返回错误值;
其他的
返回值.ToString().Equals(参数)?TrueValue:FalseValue;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值!=null&&value.Equals(TrueValue)?参数:null;
}
}
公共类EqualityToVisibilityConverter:EqualityToValueConverter{}
然后,您的Xaml可以如下所示:-

    <ListBox x:Name="QAListBox" ScrollViewer.VerticalScrollBarVisibility="Auto" SelectedIndex="-1"     
         ItemsSource="{Binding Questions}" IsTabStop="True" TabIndex="5"     
         ScrollViewer.HorizontalScrollBarVisibility="Auto" Margin="10" BorderThickness="0">
        <ListBox.Resources>
          <local:EqualityToVisibilityConverter x:Key="converter"
            TrueValue="Visible" FalseValue="Collapsed" />
        </ListBox.Resources>    
        <ListBox.ItemTemplate>    
            <DataTemplate>    
                <Grid d:DesignWidth="931" d:DesignHeight="61" d:IsLocked="True" Margin="0">    
                    <Grid.ColumnDefinitions>    
                        <ColumnDefinition Width=".80*" MinWidth="800"/>    
                        <ColumnDefinition Width=".20*" MinWidth="200"/>    
                    </Grid.ColumnDefinitions>    
                    <TextBlock Text="{Binding Path=QuestionText}" Padding="10" FontSize="21.333" FontWeight="Bold" Margin="0" Grid.Column="0" d:IsLocked="True" />    
                    <ComboBox ItemsSource="{Binding Path=AnswerAlternative}"     
                        SelectedValue="{Binding Path=QuestionsAndAnswers}" SelectedValuePath="AnswerAlternativeId"     
                        FontSize="21.333" FontWeight="Bold" Grid.Column="1" Margin="60,0,0,0" d:IsLocked="True" SelectionChanged="ComboBox_SelectionChanged"
                        Visibility={Binding InputType, Converter={StaticResource converter}, ConverterParameter=Combo}">    
                    <TextBox Text="{Binding Path=AnswerText, Mode=TwoWay}" Grid.Column="1" Margin="60,0,0,0"
                      Visibility={Binding InputType, Converter={StaticResource converter}, ConverterParameter=FreeText}">             
                </Grid>    
            </DataTemplate>    
        </ListBox.ItemTemplate>    
    </ListBox>

更复杂的解决方案将使用
ListBox
的子类和覆盖或
PrepareContainerForItemOverride
来允许分配各种项目模板。然而,我认为这对于这个问题来说是过分的

    <ListBox x:Name="QAListBox" ScrollViewer.VerticalScrollBarVisibility="Auto" SelectedIndex="-1"     
         ItemsSource="{Binding Questions}" IsTabStop="True" TabIndex="5"     
         ScrollViewer.HorizontalScrollBarVisibility="Auto" Margin="10" BorderThickness="0">
        <ListBox.Resources>
          <local:EqualityToVisibilityConverter x:Key="converter"
            TrueValue="Visible" FalseValue="Collapsed" />
        </ListBox.Resources>    
        <ListBox.ItemTemplate>    
            <DataTemplate>    
                <Grid d:DesignWidth="931" d:DesignHeight="61" d:IsLocked="True" Margin="0">    
                    <Grid.ColumnDefinitions>    
                        <ColumnDefinition Width=".80*" MinWidth="800"/>    
                        <ColumnDefinition Width=".20*" MinWidth="200"/>    
                    </Grid.ColumnDefinitions>    
                    <TextBlock Text="{Binding Path=QuestionText}" Padding="10" FontSize="21.333" FontWeight="Bold" Margin="0" Grid.Column="0" d:IsLocked="True" />    
                    <ComboBox ItemsSource="{Binding Path=AnswerAlternative}"     
                        SelectedValue="{Binding Path=QuestionsAndAnswers}" SelectedValuePath="AnswerAlternativeId"     
                        FontSize="21.333" FontWeight="Bold" Grid.Column="1" Margin="60,0,0,0" d:IsLocked="True" SelectionChanged="ComboBox_SelectionChanged"
                        Visibility={Binding InputType, Converter={StaticResource converter}, ConverterParameter=Combo}">    
                    <TextBox Text="{Binding Path=AnswerText, Mode=TwoWay}" Grid.Column="1" Margin="60,0,0,0"
                      Visibility={Binding InputType, Converter={StaticResource converter}, ConverterParameter=FreeText}">             
                </Grid>    
            </DataTemplate>    
        </ListBox.ItemTemplate>    
    </ListBox>