无法生成动态复选框

时间:2012-10-24 13:33:17

标签: c# .net wpf mvvm checkbox

我正在开发一个WPF,我需要动态生成16次Checkbox。

XAML:

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

使用上述方法,如果我将这个复选框写下16次并为其单独按下Button命令,效率将会很低。理想情况下,我希望生成它们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应用程序中实现它? :) 请帮助:)

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:0)

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

相关问题