【问题标题】:WPF Autogenerated textbox controlWPF 自动生成的文本框控件
【发布时间】:2013-11-07 11:56:11
【问题描述】:

我需要创建一些控件,比如

首先我必须有 1 个空字段。在我在该字段中写入一些文本后,将出现新字段。等等。 如果我从字段中删除所有文本 - 旧(右)字段也会被删除。

在我的项目中,我使用 MVVM。 我想到了带有 TextBox DataTemplate 的 ListBox。但是不明白如何正确使用事件或其他东西。 任何人都有一些想法或可能知道 WPF 的现成控件?

谢谢!

【问题讨论】:

  • 如果您已经尝试过解决方案,请发布该解决方案的代码以及您的具体问题。如果没有,请尝试解决方案并返回特定问题。
  • 我找到了解决方案。不是最好的(我认为),但它有效。我会尽快写的

标签: wpf textbox listbox controls auto-generate


【解决方案1】:

问题已解决。 主要思想 - 通知和处理集合中每个项目中的 PropertyChange 事件。

我们的观点:

<ListBox    Name="TrunkListBox" Height="160"
ItemsSource="{Binding YourSource}"
ItemTemplate="{DynamicResource YourDataTemplate}"/>


<DataTemplate x:Key="YourDataTemplate">
    <TextBox Width="200" Text="{Binding Number,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
//VM for notification about propertyChange
public class TrunkElementViewModel : NotificationObject
{
    private string _number = string.Empty;
    public string Number 
    {
        get { return _number; }
        set
        {
            _number=value;
            RaisePropertyChanged(() => Number);
        }
    }
}
//In my class when I initialize my data -add trunk_PropertyChanged event handler each element + add empty element
void SomeInit()
{
    if( SomeCollection already have items)
    {
    //get element and add event handler
    foreach (var item in SomeCollection)
    {
        var trunk = new TrunkElementViewModel { Number = substring };
        trunk.PropertyChanged += trunk_PropertyChanged;
        TrunkNumbers.Add(trunk);
    }
    //add empty element(must be everytime)
    var emptyTrunk = new TrunkElementViewModel();
    emptyTrunk.PropertyChanged += trunk_PropertyChanged;
    TrunkNumbers.Add(emptyTrunk);
}
//Hadling changing element event - add new empty item or remove empty
    void trunk_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    var trunk = sender as TrunkElementViewModel;
    var positionElement = TrunkNumbers.IndexOf(trunk);
    //add new item in list
    if (TrunkNumbers.LastOrDefault() == trunk)
    {
        var nextTrunk = new TrunkElementViewModel();
        nextTrunk.PropertyChanged += trunk_PropertyChanged;
        TrunkNumbers.Add(nextTrunk);
    }
    //remove item from list
    else if (trunk.Number == string.Empty && TrunkNumbers.LastOrDefault() != trunk)
    {
        trunk.PropertyChanged -= trunk_PropertyChanged;
        TrunkNumbers.Remove(trunk);
    }   
}

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多