0

TreeView数値を持つ子ノードを保持する Item を持つプログラムがありheadersます。に子ノードを追加するときTreeViewItem、それらを数値で追加したいのですが、他のノードの間にノードを追加する方法がわかりません。

integers子ノードを並べ替え、ヘッダーを に変換し、ヘッダーを入力された値と比較し、ノード ヘッダーが入力された値よりも大きい場合に停止する関数を呼び出すと思います。新しいノードは、追加される新しいノードよりも大きいヘッダーを持つノードの前に入力する必要があります。

これが最善のアプローチですか、それとももっと良い方法がありますか? これを行う最も簡単な方法を示してください。参考までに、私TreeViewItemはメイン ウィンドウにあり、別のウィンドウから作業しています。

これにより、子ノードを my に追加する方法がわかりますTreeViewItem

//Global boolean    
// bool isDuplicate;

//OKAY - Add TreeViewItems to location & Checks if location value is numerical
private void button2_Click(object sender, RoutedEventArgs e)
{
      //Checks to see if TreeViewItem is a numerical value
      string Str = textBox1.Text.Trim();
      double Num;

      bool isNum = double.TryParse(Str, out Num);

      //If not numerical value, warn user
      if (isNum == false)
          MessageBox.Show("Value must be Numerical");
      else //else, add location
      {
          //close window
          this.Close();

          //Query for Window1
          var mainWindow = Application.Current.Windows
              .Cast<Window1>()
              .FirstOrDefault(window => window is Window1) as Window1;

          //declare TreeViewItem from mainWindow
          TreeViewItem locations = mainWindow.TreeViewItem;

          //Passes to function -- checks for DUPLICATE locations
          CheckForDuplicate(TreeViewItem.Items, textBox1.Text);

          //if Duplicate exists -- warn user
          if (isDuplicate == true)
             MessageBox.Show("Sorry, the number you entered is a duplicate of a current node, please try again.");
          else //else -- create node
          {
               //Creates TreeViewItems for Location
               TreeViewItem newNode = new TreeViewItem();

               //Sets Headers for new locations
               newNode.Header = textBox1.Text;

               //Add TreeView Item to Locations & Blocking Database
               mainWindow.TreeViewItem.Items.Add(newNode);

           }
       }
}

//Checks to see whether the header entered is a DUPLICATE
private void CheckForDuplicate(ItemCollection treeViewItems, string input)
{
      for (int index = 0; index < treeViewItems.Count; index++)
      {
             TreeViewItem item = (TreeViewItem)treeViewItems[index];
             string header = item.Header.ToString();

             if (header == input)
             {
                   isDuplicate = true;
                   break;
             }
             else
                   isDuplicate = false;
      }
}

ありがとうございました。

4

1 に答える 1

1

を使用ModelViewした特殊なケースの小さな例を次に示します。BindingCollectionView

モデルビュー

public class MainViewModel
{
  private readonly ObservableCollection<TreeItemViewModel> internalChildrens;

  public MainViewModel(string topLevelHeader) {
    this.TopLevelHeader = topLevelHeader;
    this.internalChildrens = new ObservableCollection<TreeItemViewModel>();
    var collView = CollectionViewSource.GetDefaultView(this.internalChildrens);
    collView.SortDescriptions.Add(new SortDescription("Header", ListSortDirection.Ascending));
    this.Childrens = collView;
  }

  public string TopLevelHeader { get; set; }

  public IEnumerable Childrens { get; set; }

  public bool AddNewChildren(double num) {
    var numExists = this.internalChildrens.FirstOrDefault(c => c.Header == num) != null;
    if (!numExists) {
      this.internalChildrens.Add(new TreeItemViewModel() {Header = num});
    }
    return numExists;
  }
}

public class TreeItemViewModel
{
  public double Header { get; set; }
}

Xaml

<Window x:Class="WpfStackOverflowSpielWiese.Window21"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window21"
        Height="300"
        Width="300"
        x:Name="tvExample">

  <Grid DataContext="{Binding ElementName=tvExample, Path=ViewModel, Mode=OneWay}">

    <StackPanel Orientation="Vertical">
      <TextBox x:Name="tb" />
      <Button Content="Add"
              Click="AddNewItemOnClick" />
      <TreeView>
        <TreeViewItem Header="{Binding TopLevelHeader, Mode=OneWay}"
                      ItemsSource="{Binding Childrens, Mode=OneWay}">
          <TreeViewItem.ItemTemplate>
            <HierarchicalDataTemplate>
              <TextBlock Text="{Binding Header}" />
            </HierarchicalDataTemplate>
          </TreeViewItem.ItemTemplate>
        </TreeViewItem>
      </TreeView>
    </StackPanel>

  </Grid>

</Window>

Xaml コード ビハインド

public partial class Window21 : Window
{
  public static readonly DependencyProperty ViewModelProperty =
    DependencyProperty.Register("ViewModel", typeof(MainViewModel), typeof(Window21), new PropertyMetadata(default(MainViewModel)));

  public MainViewModel ViewModel {
    get { return (MainViewModel)this.GetValue(ViewModelProperty); }
    set { this.SetValue(ViewModelProperty, value); }
  }

  public Window21() {
    this.InitializeComponent();
    this.ViewModel = new MainViewModel("TopLevel");
  }

  private void AddNewItemOnClick(object sender, RoutedEventArgs e) {
    double Num;
    var isNum = double.TryParse(this.tb.Text, out Num);
    //If not numerical value, warn user
    if (isNum == false) {
      MessageBox.Show("Value must be Numerical");
      return;
    }

    var isDuplicate = this.ViewModel.AddNewChildren(Num);
    if (isDuplicate) {
      MessageBox.Show("Sorry, the number you entered is a duplicate of a current node, please try again.");
      return;
    }
  }
}

それが役立つことを願っています

于 2013-07-29T20:15:24.020 に答える