Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 从可观察集合动态创建按钮_C# 4.0_Windows 8_Windows Runtime - Fatal编程技术网

C# 4.0 从可观察集合动态创建按钮

C# 4.0 从可观察集合动态创建按钮,c#-4.0,windows-8,windows-runtime,C# 4.0,Windows 8,Windows Runtime,我有一个我正在解析的可观察集合。在这个集合中,我检查name属性是否为“critical”,如果为“critical”,那么我将尝试为每次出现的属性动态创建红色按钮 if (OBSCollection.Any(p => p.Name == "Critical")) { criticalcount = OBSCollection.Where(x => x.Name == "Critical").T

我有一个我正在解析的可观察集合。在这个集合中,我检查name属性是否为“critical”,如果为“critical”,那么我将尝试为每次出现的属性动态创建红色按钮

if (OBSCollection.Any(p => p.Name == "Critical"))
                    {

                        criticalcount = OBSCollection.Where(x => x.Name == "Critical").ToList().Count;

                        for (int i = 0; i < criticalcount; i++)
                        {
                            Button temp = new Button();
                            temp.Background = new SolidColorBrush(Windows.UI.Colors.Red);
                            temp.Width = 200;
                            temp.Height = 100;
                            temp.Content = "Critical";
                            CriticalPanel.Children.Add(temp);
                            temp.Tapped += new TappedEventHandler(bTapped_Tapped);
                        } 
private void bTapped_Tapped(object sender, TappedRoutedEventArgs e)
        {
            var toremovecritical = OBSCOllection.Where(x => x.Name == "critical").First();
            uiElements.Remove(toremovecritical);
        }
if(obscolection.Any(p=>p.Name==“Critical”))
{
criticalcount=OBSCollection.Where(x=>x.Name==“Critical”).ToList().Count;
对于(int i=0;ix.Name==“critical”).First();
uiElements.Remove(删除关键元素);
}
现在,上面的代码只在“Critical”属性出现一次时有效。我如何重写代码以适用于多次出现,从而创建多个按钮


同样在显示按钮后,如果用户单击按钮,则按钮可见属性应折叠,并且该特定项应从可观察集合中移除。我可以从可观察集合中移除按钮,但我无法从bTapped_Tapped handler中将按钮的可见性属性设置为false。是否有其他设置如何解决这个问题?

这里是一个使用MVVM的非常基本的示例

XAML:

这是一个关于如何使用绑定和MVVM的非常简单的示例,它为您的要求提供了一个起点


希望有帮助。

没有回答您的直接问题,但我想这需要一个数据模板(在您的ListView或GridView上),该模板包含按钮,并在名称值为“关键”时(通过绑定中的转换器)将可见性设置为可见。这样做可以消除所有代码(按钮点击处理除外)并在视图(按钮)和视图模型(集合)之间保持关注点的分离如果你在for迭代中放置断点,你的临界计数是否高于t1?同样,如果你在for迭代后放置断点,如果你检查CriticalPanel。Children,你是否有多个孩子?@Oliver现在,我知道我只有一个孩子,所以代码可以工作。我的问题是,如果有多个“临界”,然后我的代码将尝试创建多个具有相同名称的按钮,这将抛出一个错误。然后,如果没有必要,请不要给按钮命名,或者给它命名为:“buttonName”+i,这样您将拥有buttonName1、buttonName2等,并且您的名称将保持唯一
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <GridView ItemsSource="{Binding Things}">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Button Width="100" Height="100" Background="Red" Content="{Binding Name}" Click="CriticalClick" DataContext="{Binding}"></Button>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

</Grid>
public class ThingViewModel
{
    public ObservableCollection<Thing> Things { get; set; }

    public ThingViewModel()
    {
        var allThings = new List<Thing>();

        for (int i = 0; i < 30; i++)
        {
            if (i % 2 == 0)
                allThings.Add(new Thing { Name = "Critical" });
            else
                allThings.Add(new Thing { Name = "`NonCritical" });
        }

        this.Things = new ObservableCollection<Thing>(allThings.Where(x => x.Name == "Critical"));
    }
}

  public class Thing
  {
      public string Name { get; set; }
  }
protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        this.DataContext = new ThingViewModel();
    }

    private void CriticalClick(object sender, RoutedEventArgs e)
    {
        var tappedThing = (Thing) ((Button) sender).DataContext;

        ((ThingViewModel) this.DataContext).Things.Remove(tappedThing);
    }