【问题标题】:wpf listview button to add a row between the lineswpf listview按钮在行之间添加一行
【发布时间】:2014-10-23 06:36:18
【问题描述】:

嘿stackoverflow社区

我的问题是我得到了一个具有不同绑定的列表视图(参见图 1 和 XAML),当有人单击“+”按钮时,应在此单击的行上方插入一行空白或在本例中为 00 00 00 00信息(见图2)。

图片 一个

图二

XAML:

    <ListView Margin="49,61,0,0" HorizontalAlignment="Left" MaxWidth="600" VerticalAlignment="Top" Name="lvDataBinding" Height="227" Width="402" >

        <ListView.ItemTemplate>
            <DataTemplate>
                <WrapPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding fieldblock_0}" Background="{Binding background_fieldblock_0}"  />
                    <TextBlock Text=" ][ " />
                    <TextBlock Text="{Binding fieldblock_1}" Background="{Binding background_fieldblock_1}"  />
                    <TextBlock Text=" ][ " />
                    <TextBlock Text="{Binding fieldblock_2}" Background="{Binding background_fieldblock_2}"  />
                    <TextBlock Text=" ][ " />
                    <TextBlock Text="{Binding fieldblock_3}" Background="{Binding background_fieldblock_3}" />
                    <TextBlock Text=" ][ " />
                    <TextBlock Text="{Binding fieldblock_4}" Background="{Binding background_fieldblock_4}" />
                    <TextBlock Text=" ]" />

                    <Button Click = "addrowbutton" Tag="{Binding}" Height="18" >+  </Button>
                </WrapPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    </Grid>

MainWindow.xaml.cs:

  public MainWindow()
    {
        InitializeComponent();
        List<mainpart_compare> items5 = new List<mainpart_compare>();
        for (int i = 0; i < 5; i++)
        {
            items5.Add(new mainpart_compare()
                      {
                          fieldblock_0 = "00 06 ",
                          fieldblock_1 = "00 06 ",
                          fieldblock_2 = "00 06 ",
                          fieldblock_3 = "00 06 ",
                          fieldblock_4 = "00 06 ",
                          background_fieldblock_0 = "white",
                          background_fieldblock_1 = "white",
                          background_fieldblock_2 = "white",
                          background_fieldblock_3 = "white",
                          background_fieldblock_4 = "white",
                      });

        }
        lvDataBinding.ItemsSource = items5;
    }

    public class mainpart_compare
    {

        // Goto Field information
        public string fieldblock_0 { get; set; }
        public string fieldblock_1 { get; set; }
        public string fieldblock_2 { get; set; }
        public string fieldblock_3 { get; set; }
        public string fieldblock_4 { get; set; }
        public string background_fieldblock_0 { get; set; }
        public string background_fieldblock_1 { get; set; }
        public string background_fieldblock_2 { get; set; }
        public string background_fieldblock_3 { get; set; }
        public string background_fieldblock_4 { get; set; }
    }

    private void addrowbutton(object sender, RoutedEventArgs e)
    {
        // here is the part where i dont know what to do.

    }

【问题讨论】:

    标签: c# wpf xaml listview button


    【解决方案1】:

    我的想法是确定你按下的行数,然后在这个地方插入你的列表。您的 items5 是我的列表,尽管我将其创建为 ObservaebleCollection 以反映任何更改。

     <ListView ItemsSource="{Binding Lista}" AlternationCount="{Binding Lista.Count}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Width="40" Text="{Binding (ItemsControl.AlternationIndex),RelativeSource={RelativeSource AncestorType=ListViewItem}}"/>
                        <TextBlock Width="40" Text="{Binding }"/>
                        <Button Width="40" Content="+" Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.Cmd}"
                                CommandParameter="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ListViewItem}}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    
        public ObservableCollection<int> Lista { get; set; }
        private RelayCommand cmd;
        public RelayCommand Cmd
        {
            get { return cmd ?? (cmd = new RelayCommand(new Action<object>(AddRow))); }
        }
        public MainWindow()
        {
            Lista = new ObservableCollection<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            InitializeComponent();
            this.DataContext = this;
        }
    
        void AddRow(object obj)
        {
            int numer;
            Int32.TryParse(obj.ToString(), out numer);
            Lista.Insert(numer, 55);           
        }
    

    我一直插入 55 以查看更改。正常输出:

    第一列是行号,第二列是列表中的值。您将拥有您的 [00...]。当我单击最后一行时,我将添加 55 个,因为

    Lista.Insert(numer, 55);    
    


    【讨论】:

    • 当我添加 200 个项目并在位置 150 处按下“+”按钮时,我遇到了问题,他将数字顺序从 1-200 更改为 150-201 +1-150。所以他从一个错误的点开始......有没有可能的方法来检查数字顺序是否正确,如果不正确,他会重建一切。
    【解决方案2】:

    谢谢你的回答。 我想稍微修改一下代码,但不知何故它甚至没有显示任何东西,而是显示了错误:

    BindingExpression 路径错误:在“对象”“MainWindow”(名称=“”)上找不到“Lista”属性。绑定表达式:路径=列表;数据项='主窗口'(名称='');

      <ListView ItemsSource="{Binding lista}" AlternationCount="{Binding Lista.Count}" Name="TestVIew">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Width="40" Text="{Binding (ItemsControl.AlternationIndex),RelativeSource={RelativeSource AncestorType=ListViewItem}}"/>
                        <TextBlock Width="40" Text="{Binding Text_nr1}"Background="{Binding Text_nr1_background}"/>
                        <TextBlock Width="40" Text="{Binding Text_nr2}" Background="{Binding Text_nr1_background}"/>
    
                        <Button Width="40" Content="+" Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.Cmd}"
                            CommandParameter="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ListViewItem}}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    

    现在我想更改 2 个不同 TextBlocks (Background="{Binding Text_nr1_background}") 的背景。

        public ObservableCollection<Lista> lista;
        private RelayCommand cmd;
        public RelayCommand Cmd
        {
            get { return cmd ?? (cmd = new RelayCommand(new Action<object>(AddRow))); }
        }
        public MainWindow()
        {
            lista = new ObservableCollection<Lista>() { new Lista() { Text_nr1 = "test", Text_nr1_background="green", Text_nr2_background="red",Text_nr2 = "test2" } };
            InitializeComponent();
            this.DataContext = this;
        }
    
        void AddRow(object obj)
        {
            int numer;
            Int32.TryParse(obj.ToString(), out numer);
            lista.Insert(numer, new Lista() { Text_nr1 = "test", Text_nr1_background = "green", Text_nr2_background = "red", Text_nr2 = "test2" });
        }
    

    列表类:

    public class Lista
    {
        public string Text_nr1 { get; set; }
        public string Text_nr1_background { get; set; }
        public string Text_nr2 { get; set; }
        public string Text_nr2_background { get; set; }  
    }
    

    【讨论】:

    • lista 必须是属性 {get;set;}
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2013-07-12
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多