如何在WPF中动态显示的控制? [英] How to display a control dynamically in wpf?

查看:101
本文介绍了如何在WPF中动态显示的控制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个收集与领域城市名,Statename的和COUNTRYNAME,我该集合绑定到我的WPF的形​​式。我想显示的城市名的文本框,在组合框中Statename的,并在组合框中COUNTRYNAME。所有文本框和组合框应该动态。我该怎么做工作?

I have a collection with fields cityname, statename and countryname and I bind that collection to my wpf form. I want to display the cityname in a Textbox, the statename in a combobox and the countryname in a combobox. All the textboxes and comboboxes should come dynamically. How can I do this job?

中的任何一个建议我如何动态地在WPF使用MVVM设计该窗体 我试图做到这一点code,但没有得到正确的结果。

Any one suggest me how to design this form dynamically in wpf using MVVM I am trying to do this code but not get result properly

<UserControl.Resources>

<DataTemplate x:Key="IntegerTemplate">
    <DockPanel>
        <TextBox Margin="10,0,0,0" x:Name="IntegerTemplate" Grid.Column="1" MaxLength="{Binding Path=CardField.MaximumLength}" Text="{Binding Path=CardField.FieldData, Mode=TwoWay}" />
    </DockPanel>
</DataTemplate>

<DataTemplate x:Key="StringTemplate">
    <DockPanel>
        <ComboBox Margin="10,0,0,0" x:Name="cmbFieldData" Grid.Column="1" Text="{Binding Path=CardField.FieldData, Mode=TwoWay}" />
    </DockPanel>
</DataTemplate>
<DataTemplate x:Key="DefaultTemplate">
</DataTemplate>
<DataTemplate x:Key="dataTemplate">
    <ContentControl x:Name="MyContentControl"  Content="{Binding}" ContentTemplate="{StaticResource DefaultTemplate}"/>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=CardField.FieldTag}" Value="City">
                <Setter TargetName="MyContentControl" Property="ContentTemplate"
                   Value="{StaticResource IntegerTemplate}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=CardField.FieldTag}" Value="State">
                <Setter TargetName="MyContentControl" Property="ContentTemplate"
                   Value="{StaticResource StringTemplate}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=CardField.FieldTag}" Value="Country">
                <Setter TargetName="MyContentControl" Property="ContentTemplate"
                   Value="{StaticResource StringTemplate}" />
            </DataTrigger>
            <!-- and so on -->
        </DataTemplate.Triggers>
    </DataTemplate>
</UserControl.Resources>

我们将在我们的XAML页面使用此code

we are using this code in our xaml page

<ItemsControl x:Name="items"
 ItemsSource="{Binding}"
 ItemTemplate="{StaticResource dataTemplate}"
/>

更新: 我试图做到这一点下面的code:

UPDATE: i am trying to do this following code:

<TextBlock x:Name="tbFieldTag" Cursor="Hand" VerticalAlignment="Center" HorizontalAlignment="Stretch" TextWrapping="Wrap" Margin="10,0,0,0" Text="{Binding Path=CardField.FieldTag}" />
            <ItemsControl x:Name="items"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource dataTemplate}"/>

在我得到的TextBlock的价值,但我没有得到在ItemTemplate中的价值。所以在这里我做错了吗?

In that i got Value of TextBlock but i am not getting the value in ItemTemplate. so where I doing wrong?

推荐答案

试试这个:

1)数据模板选择器

  public class CardFieldTemplateSelector : IValueConverter
    {

            public DataTemplate CityNameTemplate { get; set; } 

            public DataTemplate StateNameTemplate { get; set; }


            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                string fieldTag = (string) value;
                switch (fieldTag)
                {
                    case "City":
                        return CityNameTemplate;
                    case "State":
                        return StateNameTemplate;
                }

                throw new ArgumentOutOfRangeException();
            }

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

2)XAML:

2) XAML:

 <selectors:CardFieldTemplateSelector x:Key="cardFieldTemplateSelector">
   <selectors:CardFieldTemplateSelector.CityNameTemplate>
     <DataTemplate>
      <DockPanel>
        <TextBox Margin="10,0,0,0" x:Name="IntegerTemplate" Grid.Column="1" MaxLength="{Binding Path=CardField.MaximumLength}" Text="{Binding Path=CardField.FieldData, Mode=TwoWay}" />
      </DockPanel>
     </DataTemplate>
   </selectors:CardFieldTemplateSelector.CityNameTemplate>

   <selectors:CardFieldTemplateSelector.StateNameTemplate>
     <DataTemplate>
      <DockPanel>
        <ComboBox Margin="10,0,0,0" x:Name="cmbFieldData" Grid.Column="1" Text="{Binding Path=CardField.FieldData, Mode=TwoWay}" />
     </DockPanel>
     </DataTemplate>
   </selectors:CardFieldTemplateSelector.StateNameTemplate>
 </selectors:CardFieldTemplateSelector>

<DataTemplate x:Key="dataTemplate">
   <ContentControl x:Name="MyContentControl" 
                   Content="{Binding}"
                   ContentTemplate="{Binding CardField.FieldTag, Converter={StaticResource cardFieldTemplateSelector}"/>
</DataTemplate>

<ItemsControl x:Name="items"
 ItemsSource="{Binding}"
 ItemTemplate="{StaticResource dataTemplate}"/>

这篇关于如何在WPF中动态显示的控制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆