我有大约9个复选框,允许您选择可用于未来功能的项目。然后我想调用我的函数来随机选择其中一个项目X%的时间(X由常量设置,以确定这种情况应该发生的频率),一个项目被选中,它需要从列表因此下次我们需要调用foo()时不会再次选择它。
我原本以为我会在最初的复选框中进行迭代,并将可用的列表添加到列表中。我会随机确定是否应该拉一个项目,然后从列表中拉出它然后删除列表项。
这是最好的方法吗?
答案 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>