【问题标题】:Using one function to clear one of multiple ListBoxes使用一个函数清除多个列表框之一
【发布时间】:2016-12-24 03:18:15
【问题描述】:

我有三个ListBoxes 和三个“清除”buttons,这三个Listboxes 各有一个。现在,我将所有“清除”buttons 链接到同一个点击功能。在该函数中,我使用switch 来确定要清除哪个ListBox。我想知道是否有办法摆脱switch 语句并将其替换为一行代码,以确定要清除哪个ListBox。我需要将每个button 与相应的ListBox 链接起来的东西。我弄乱了ButtonsTag 属性,但没有运气。

这是当前的代码:

Xaml(ClearBtn1 清除 lb1 等):

<Button Name="ClearBtn1"
        Click="ClearBtn_Click"
        Content="Clear" />

<Button Name="ClearBtn2"
        Click="ClearBtn_Click"
        Content="Clear" />

<Button Name="ClearBtn3"
        Click="ClearBtn_Click"
        Content="Clear" />

<ListBox Name="lb1" />

<ListBox Name="lb2" />

<ListBox Name="lb3" />

后面的代码:

private void ClearBtn_Click(object sender, RoutedEventArgs e)
{
    Button btn = (Button)sender;
    string name = btn.Name; //Gets the button name which corresponds to a certain listbox

    switch (name)
    {
        case "ClearBtn1":
            { ClearListBox(lb1); return; }
        case "ClearBtn2":
            { ClearListBox(lb2); return;}
        case "ClearBtn3":
            { ClearListBox(lb3); return; }
    }
}

public void ClearListBox(ListBox listbox)
{
    listbox.Items.Clear();
}

使用Tag 我正在尝试类似:

<Button Name="ClearBtn1"
        Click="ClearBtn_Click"
        Content="Clear"
        Tag="lb1" />

private void ClearBtn_Click(object sender, Rout
{
    Button btn = (Button)sender;
    string name = btn.Name; 

    ClearListBox(btn.Tag); //doesn't work
}

这不起作用,因为我无法将 string 转换为 ListBox

【问题讨论】:

    标签: c# wpf button listbox


    【解决方案1】:

    尝试将元素绑定到标签,而不仅仅是字符串:

    <Button Name="ClearBtn1"
        Click="ClearBtn_Click"
        Content="Clear"
        Tag="{Binding ElementName=lb1}"/>
    

    【讨论】:

    • 谢谢!正是我需要的。
    【解决方案2】:

    我已经修改了你的代码以获得预期的结果。

    <Button Tag="{Binding ElementName=lb1}"  Name="ClearBtn1"
        Click="ClearBtn_Click"
        Content="Clear" />
    
    <Button Tag="{Binding ElementName=lb2}"  Name="ClearBtn2"
        Click="ClearBtn_Click"
        Content="Clear" />
    
    <Button Tag="{Binding ElementName=lb3}"  Name="ClearBtn3"
        Click="ClearBtn_Click"
        Content="Clear" />
    
    <ListBox Name="lb1" />
    
    <ListBox Name="lb2" />
    
    <ListBox Name="lb3" />
    

    并修改 ClearBtn_Click 如下

    private void ClearBtn_Click(object sender, RoutedEventArgs e)
    {
        Button btn = (Button)sender;
        var list = btn.Tag as ListBox;
        ClearListBox(list);
    }
    

    【讨论】:

    • 这行得通,@joe 刚刚回答了第一个问题。感谢您提供替代选项!
    【解决方案3】:

    你可以做这样的事情。

    将您的列表框保存在列表框类型的列表中。 喜欢

    List<ListBox> listBoxes = new List<ListBox>();
    listBoxes.Add(lb1);
    listBoxes.Add(lb2);
    listBoxes.Add(lb3);
    

    并将索引号作为命令参数放在每个按钮上

    <Button Name="ClearBtn1"
            Click="ClearBtn_Click"
            Content="Clear"
            CommandParameter="0" />
    
    <Button Name="ClearBtn2"
            Click="ClearBtn_Click"
            Content="Clear" 
            CommandParameter="1"/>
    
    <Button Name="ClearBtn3"
            Click="ClearBtn_Click"
            Content="Clear"
            CommandParameter="2" />
    

    然后在你的按钮点击功能

    private void ClearBtn_Click(object sender, Rout
    {
        Button btn = (Button)sender;
        int index = int.Parse(btn.CommmandParamter);
    
        ClearListBox(index);
    }
    

    现在您的 ClearListBox 函数将接收索引作为参数而不是列表框。

    public void ClearListBox(int index)
    {
        listBoxes[index].Items.Clear();
    }
    

    希望能解决您的问题。

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2015-08-10
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多