0

我正在开发一个 WPF,我需要在其中动态生成 16 次复选框。

XAML:

<Checkboxes Height="14" Command="{Binding CheckboxesGen}" Margin="0" Name="checkBox1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center" />

使用上述方式,如果我写下此复选框 16 次并为它们设置单独的按钮单击命令,效率会很低。理想情况下,我希望生成它们 16 次,并在我的 viewmodel 类中使用一种通用方法,如下所示:

private ICommand mCheckboxesGen;
    public ICommand CheckboxesGen
    {
        get
        {
            if (mCheckboxesGen== null)
                mCheckboxesGen= new DelegateCommand(new Action(mCheckboxesGenExecuted), new Func<bool>(mCheckboxesGenCanExecute));

            return mCheckboxesGen;
        }
        set
        {
            mCheckboxesGen= value;
        }
    }

    public bool mCheckboxesGenCanExecute()
    {
        return true;
    }

    public void mCheckboxesGenExecuted(some INDEX parameter which gives me selected Checkboxes )
    {
        // Have a common method here which performs operation on each Checkboxes click based on INDEX which determines which Checkboxes I have selected
    }

我在我的 C++ 应用程序中遇到了同样的情况。我在我的 C++ 应用程序中完成了如下操作:

for(int j = 0; j < 16; j ++)
    {
        m_buttonActiveChannels[j] = new ToggleButton();
        addAndMakeVisible(m_buttonActiveChannels[j]);
        m_buttonActiveChannels[j]->addButtonListener(this);
    }

//Checking which Checkboxes is clicked
unsigned bit = 0x8000;
for(int i = 15; i >= 0; i--)
{
    if(0 != (value & bit)) //Value has some hardcoded data
    {
        m_buttonActiveChannels[i]->setToggleState(true);
    } 
    else
    {
        m_buttonActiveChannels[i]->setToggleState(false);
    }

    bit >>= 1;
}

因此,使用它会生成 16 次,并且有一种基于index i.

使用类似的方法或任何其他方法,如何在我的 wpf 应用程序中实现它?:) 请帮忙 :)

4

2 回答 2

1

这样的事情怎么样?

<ItemsControl ItemsSource="{Binding CollectionOfObjectsThatRepresentYourCheckBox}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"
                        IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Checkbox Content="{Binding DisplayText }" Checked="{Binding Checked}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

您需要在加载对象或执行命令时填充您的集合,然后您可以对在您为其创建的模型中检查的项目做出反应。

public class CheckBoxClass
{
 public int Index {get; set;}
 public string DisplayText {get; set}
 private bool _checked;
 public bool Checked 
 {
   get { return _checked;}
   set {
        _checked = value
        doSomethingWhenChecked();
       }
}

ObservableCollection<CheckBoxClass> CollectionOfObjectsThatRepresentYourCheckBox = SomeMethodThatPopulatesIt();

这是一种更简洁的方法,您只需绑定到将由复选框表示的对象列表,而不是生成控件。

于 2012-10-24T13:55:31.817 回答
0

为复选框定义一个视图模型,这个类将有一个 Index 属性和基于它的命令实现。将复选框视图模型的 ObservableCollection 添加到当前视图模型。在视图中添加一个 ItemsControl,并使用适当的 ItemTemplate 绑定到此集合。您现在可以在视图模型中动态添加任意数量的复选框。

于 2012-10-24T13:44:46.440 回答