【问题标题】:Failing to generate dynamic Checkboxes无法生成动态复选框
【发布时间】:2012-10-24 22:01:43
【问题描述】:

我正在开发一个 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 应用程序中实现它? :) 请帮忙:)

【问题讨论】:

    标签: c# .net wpf mvvm checkbox


    【解决方案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();
    

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

    【讨论】:

    • 是的,你是对的 :) 但这会生成一个在另一个之上的复选框。理想情况下,根据要求,我应该在一行中拥有所有 16 个 chckbxs :)
    • 使用 ItemsPanelTemplate msdn.microsoft.com/en-us/library/…
    • @StonedJesus 很好,请查看更新的代码 - 应该会显示您想要的方式 :)
    • @StonedJesus 您在将项目添加到 ObservableCollection 时需要设置索引 - 如何使用 For 循环并将索引设置为当前循环索引?
    • @Steoates:当我添加项目时,我已经完成了设置索引。我们如何继续使用 forloop?
    【解决方案2】:

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

    【讨论】:

    • 谢谢 :) 如果您能详细说明示例代码,将不胜感激 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多