如何在按钮点击上添加新的ObservableCollection?

时间:2014-01-17 15:40:47

标签: c# wpf string xaml observablecollection

当我单击表单中的某个按钮并在显示的Textbox中输入一个字符串时,我需要它来创建一个带有该字符串名称的新ObservableCollection列表。

然后,表单上会出现带有字符串名称的标签。然后,我们为该标签创建了ContextMenu。从这里,您可以在单击的列表中添加另一个字符串。

这是字符串的保存按钮:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    string titleName = txtTitle.Text;

    _viewmodel.RenameTitle(titleName);
   _Addtitle.Execute(null);
    this.Close();
}

然后我们进入ViewModel类( titleName是第一个输入的字符串)。

public ICommand AddTitleCommand { get; set; }

public ViewModel()
{   
    this.AddTitleCommand = new RelayCommand(new Action<object>((o) => OnAddTitle()));
}

private void OnAddTitle()
{
    NewTitle += titleName;
}

OnAddTitle()方法和下面两个方法是问题出现的地方。 此时,titleName字符串被拆分,每个字符在表单上显示为新集合(我们假设),而不是标题是一个集合。 - 应该有多个带有多个集合的标题,每个标题都有自己的集合。标题应该是一个单词,而不是分成单个字符。

public string NewTitle
{
    get { return newTitle; }
    set { newTitle = value; OnPropertyChanged(() => NewTitle); }
}

public void AddCollection()
{
    ObservableCollection<string> collection = new ObservableCollection<string>();
    collection.Add(NewTitle);
    Collections.Add(collection);
}

ItemsSource绑定到NewTitle属性的表单上的XAML代码:

<StackPanel Name="Content" Margin="0,99,0,0">


        <TextBox x:Name="txtname" Height="23" TextWrapping="Wrap" Margin="200,0,500,0"/>


        <ListView x:Name="TitleList" ItemsSource="{Binding NewTitle}" ItemTemplate="{DynamicResource Template}" BorderBrush="{x:Null}">
        </ListView>
</StackPanel>

编辑:

这就是它的样子,它应该在集合中显示为一个字符串。

enter image description here

1 个答案:

答案 0 :(得分:2)

我强烈建议您继续研究MVVM,因为您需要更改使用WPF的方式。但我认为你的问题在于你使用的是

ObservableCollection<ObservableCollection<string>>

当你真正需要的是这样的时候:

 public class YourTitleClass : INotifyPropertyChanged
 {
    private string _title;
    public string Title
    {
       get { return _title; }
       set
       {
          if (_title.Equals(value))
             return;

          _title = value;
          RaisePropertyChanged(() => Title);
       }
    }

    private ICollection<string> _subtitles;
    public ICollection<string> Subtitles
    {
       get
       {
          if (_subtitles == null)
             _subtitles = new ObservableCollection<string>();
          return _subtitles;
       }
       set
       {
          if (value == _subtitles)
             return;

          _subtitles = value;
          RaisePropertyChanged(() => Subtitles);
       }
    }

    public YourTitleClass(string title)
    {
       _title = title;
    }       
}

然后,您的AddCollection方法需要将此类的实例添加到ViewModels集合

public void AddCollection()
{
   YourTitleClass newTitleClass = new YourTitleClass(NewTitle);
   Collections.Add(newTitleClass);
}

确保将ViewModel中的集合类型更改为

ObservableCollection<YourTitleClass>

现在,当您添加“副标题”(或此子集合所代表的任何内容)时,您将其添加到YourTitleClass.Subtitles。如果您使用的是对象的父级别,则为YourTitleClass.Title。