如何处理可选项

时间:2011-11-06 18:49:51

标签: c# collections

我有大约9个复选框,允许您选择可用于未来功能的项目。然后我想调用我的函数来随机选择其中一个项目X%的时间(X由常量设置,以确定这种情况应该发生的频率),一个项目被选中,它需要从列表因此下次我们需要调用foo()时不会再次选择它。

我原本以为我会在最初的复选框中进行迭代,并将可用的列表添加到列表中。我会随机确定是否应该拉一个项目,然后从列表中拉出它然后删除列表项。

这是最好的方法吗?

2 个答案:

答案 0 :(得分:1)

创建一个引用复选框的集合。从该集合中随机选择,一旦选中就将其删除。这样您就不会重复使用相同的复选框。

答案 1 :(得分:0)

有几点:
1)不要将您的UI与您的业务逻辑混合在一起 2)您可以使用集合和DataTemplate构建更好的解决方案,如下所示:

C#

public class ThingType : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    public string ThingName { get; set; }

    private bool thingAvailable;
    public bool ThingAvailable { get { return thingAvailable; } set { thingAvailable = value; PropertyChanged(this, new PropertyChangedEventArgs("ThingAvailable")); } }
}

public class MainVM 
{
    public ObservableCollection<ThingType> MyThings { get; set; }


    public MainVM()
    {
        MyThings = new ObservableCollection<ThingType>();
        MyThings.Add(new ThingType() { ThingName = "thing 1" });
        MyThings.Add(new ThingType() { ThingName = "thing 2" });
    }

    public ThingType GetRandomThing()
    {
        var availableThings = MyThings.Where(x => x.ThingAvailable == true).ToArray();
        int randomThingIndex = new Random().Next(availableThings.Length - 1);
        availableThings[randomThingIndex].ThingAvailable = false;
        return availableThings[randomThingIndex];
    }
}

XAML

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate x:Key="thingTemplate">
            <CheckBox Content="{Binding ThingName}" IsChecked="{Binding ThingAvailable, Mode=TwoWay}"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox Height="100" HorizontalAlignment="Left" Margin="135,56,0,0" Name="listBox1" VerticalAlignment="Top" ItemsSource="{Binding MyThings}" ItemTemplate="{StaticResource thingTemplate}" Width="120" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="88,195,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>