Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# 已检查ItemsControl中所有切换按钮与的XAML绑定_C#_Wpf_Xaml_Binding_Togglebutton - Fatal编程技术网

C# 已检查ItemsControl中所有切换按钮与的XAML绑定

C# 已检查ItemsControl中所有切换按钮与的XAML绑定,c#,wpf,xaml,binding,togglebutton,C#,Wpf,Xaml,Binding,Togglebutton,我见过许多与我类似的问题,但没有一个能解决我的问题 我拥有的是一组存在于ItemsControl中的切换按钮,这些切换按钮是在运行时根据ItemsControl的ItemSource绑定到的索引中的人数动态创建的。在UI中单击这些切换按钮时,会根据人员的姓名进行一些过滤。如果需要,可以选择多个按钮甚至所有按钮。还有一个“清除”按钮,它简单地删除所有过滤,并应重置切换按钮的单击状态 我的问题是,当我单击“清除”按钮时,所有被单击的切换按钮都保持单击状态。我试图通过将IsClicked值绑定到代码中

我见过许多与我类似的问题,但没有一个能解决我的问题

我拥有的是一组存在于ItemsControl中的切换按钮,这些切换按钮是在运行时根据ItemsControl的ItemSource绑定到的索引中的人数动态创建的。在UI中单击这些切换按钮时,会根据人员的姓名进行一些过滤。如果需要,可以选择多个按钮甚至所有按钮。还有一个“清除”按钮,它简单地删除所有过滤,并应重置切换按钮的单击状态

我的问题是,当我单击“清除”按钮时,所有被单击的切换按钮都保持单击状态。我试图通过将IsClicked值绑定到代码中管理的属性,让clear按钮将每个ToggleButton的IsClicked值重置为false,但无论我尝试什么,我都无法使其工作

代码:

Xaml

C#模型:

我被卡住了。我觉得绑定不起作用的原因是切换按钮是在ItemsControl中动态创建的,但我不确定这是否是错误的,或者如果是,如何修复它

更新
我能够通过交换ToggleButtons ItemsControl绑定到的可观察集合的数据来解决这个问题,这触发了整个toggle buttons集合的OnPropertyChanged,从而重置了UI的该部分。这是一个简单的黑客攻击,几乎没有开销和四行代码,但并没有真正回答最初的问题

peopleSorted
中的每个项目调用
ClearFiltering()
的代码在哪里?我认为您需要类的确切实例才能更改这些值。如果没有确切的实例,则值不会更改。为了能够完全理解您的问题,请提供与您的问题相关的完整代码。我尝试包含更多代码。ClearFiltering()只清除UI上的一些颜色,它不在peopleSorted上运行,也不需要。这工作正常,与我的切换按钮问题无关,因此不会显示执行此操作的代码。对于每个项目,
ToggleButton.IsChecked
绑定到该项目的
IsChecked
属性,该属性由该项目的
ClearFiltering()
方法清除。您写道,“还有一个“清除”按钮,它可以简单地删除所有过滤,并应重置切换按钮的单击状态。”您试图解决的问题是什么?模型和viewmodel是不同的类吗?是否每个类都有一个完全不相关的
IsChecked
属性,而您正在清除错误的属性?@否IsChecked对于每个类来说都不是不相关的,是的,model和viewmodel是独立的类。我在模型中有很多绑定属性,它们的实现方式与我检查的方式相同,可以很好地工作。如果这不清楚,很抱歉,但问题是ClearFiltering方法应该重置切换按钮,但没有。根据您的评论,是否应将IsChecked命名为其他名称?您让它听起来像是我在将切换按钮的属性绑定到它自己,其中是对
peopleSorted
中的每个项目调用
ClearFiltering()
的代码?我认为您需要类的确切实例才能更改这些值。如果没有确切的实例,则值不会更改。为了能够完全理解您的问题,请提供与您的问题相关的完整代码。我尝试包含更多代码。ClearFiltering()只清除UI上的一些颜色,它不在peopleSorted上运行,也不需要。这工作正常,与我的切换按钮问题无关,因此不会显示执行此操作的代码。对于每个项目,
ToggleButton.IsChecked
绑定到该项目的
IsChecked
属性,该属性由该项目的
ClearFiltering()
方法清除。您写道,“还有一个“清除”按钮,它可以简单地删除所有过滤,并应重置切换按钮的单击状态。”您试图解决的问题是什么?模型和viewmodel是不同的类吗?是否每个类都有一个完全不相关的
IsChecked
属性,而您正在清除错误的属性?@否IsChecked对于每个类来说都不是不相关的,是的,model和viewmodel是独立的类。我在模型中有很多绑定属性,它们的实现方式与我检查的方式相同,可以很好地工作。如果这不清楚,很抱歉,但问题是ClearFiltering方法应该重置切换按钮,但没有。根据您的评论,是否应将IsChecked命名为其他名称?你让它听起来像我是绑定属性的切换按钮本身
<Button Content="Clear Filter" HorizontalAlignment="Center" Margin="0,0,0,1" VerticalAlignment="Bottom" Grid.Column="1" Click="ClearClick"/>

            <ItemsControl ItemsSource="{Binding Source={StaticResource peopleSorted}}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <ToggleButton Name="toggleButton" Margin="0,0,5,0" Command="ApplicationCommands.Open" 
                                      CommandParameter="{Binding Name}" IsChecked="{Binding IsChecked, Mode=TwoWay}">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Name}" />
                            </StackPanel>
                        </ToggleButton>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
 private void ClearClick(object sender, RoutedEventArgs e)
        {
            this.m_viewModel.ClearFiltering();
        }
 public bool IsChecked
            {
                get
                {
                    return this.m_isChecked;
                }

                set
                {
                    this.m_isChecked = value;
                    this.OnPropertyChanged("IsChecked");
                }
            }private bool m_isChecked;

public void ClearFiltering()
        {
            m_hashTable.Clear();
            this.IsChecked = false;
        }