动态创建TextBox并将它们绑定到列表

时间:2016-02-25 19:56:13

标签: c# wpf xaml mvvm

我正在尝试实现一个创建掩码,用户可以在其上创建具有不同版本的新技术(例如:.NET版本4.5.2和4.6等)。为此,我希望用户能够为其他版本动态添加文本框。

对此的要求是使用MVVM模式,这是我相当新的。我为此创建了以下类:

Entitiy Classes(使用实体框架)

public class Tech : EntityBase
{
    // Properties
    public string TechName { get; set; }

    // Navigation Properties
    public virtual ICollection<TechVersion> TechVersions{ get; set; }
}

public class TechVersion : EntityBase
{
    // Properties
    public string VersionNumber { get; set; }

    // Foreign Keys
    //public int TechId{ get; set; }

    // Navigation Properties
    public virtual Tech Tech{ get; set; }
}

技术视图模型

public class TechnologyUpdateViewModel : ObservableObject
{
    private string _technologyName;
    public string TechnologyName
    {
        get
        {
            return _technologyName;
        }
        set
        {
            if (_technologyName != value)
            {
                _technologyName = value;
                OnPropertyChanged("TechnologyName");
            }
        }
    }

    private ICommand _add;
    public ICommand Add
    {
        get
        {
            if (_add == null)
            {
                _add = new RelayCommand(e => CreateTechnology());
            }
            return _add;
        }
        set
        {
            if (_add != value)
            {
                _add = value;
                OnPropertyChanged("Add");
            }
        }
    }

    private void CreateTechnology()
    {
        // Add new Technology from ViewModel Properties
    }
}

但是我遇到了XAML代码问题。绑定技术名称并添加一个只有名称的新技术可以正常工作(文本框+按钮)。 但是,如何获取动态创建的文本框并将它们绑定到ViewModel?

我尝试过我找到的方法here 为此,我添加了public ObservableCollection<string> Versions { get; set; } 但大多数解决方案都尝试从已填充的列表中创建控件。我正在尝试创建文本框并将它们绑定到空列表。

TechnologyAdd.xaml

<UserControl x:Class="Presentation.Views.TechnologyAddOrEdit"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Presentation.Views"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<StackPanel>
    <StackPanel MaxWidth="250">
        <DockPanel>
            <TextBlock>Name: </TextBlock>
            <TextBox Text="{Binding TechnologyName}" Margin="10,0,0,0" />
        </DockPanel>

        <!-- Approach from the Link -->
        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <ItemsControl ItemsSource="{Binding Versions}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding}"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

        <Button Content="Save" Command="{Binding Add}" />
    </StackPanel>
</StackPanel>

也许整个MVVM的事情让我感到困惑,但我似乎无法为此找到解决方案。 我很高兴有关如何正确处理此问题的任何信息。

0 个答案:

没有答案