C# 未能清除以前在wpf中单击radiobutton上显示的标签

C# 未能清除以前在wpf中单击radiobutton上显示的标签,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我正在基于radiobutton click动态生成标签。嗯,我已经成功地做到了这一点,但每次我点击一个按钮,它会生成标签,但不会清除以前的状态。代码如下: XAML: <Grid Grid.Row="0"> <ItemsControl ItemsSource="{Binding Children}"> <ItemsControl.ItemTemplate>

我正在基于radiobutton click动态生成标签。嗯,我已经成功地做到了这一点,但每次我点击一个按钮,它会生成标签,但不会清除以前的状态。代码如下:

XAML:

<Grid Grid.Row="0">                     

        <ItemsControl ItemsSource="{Binding Children}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" >
                        <RadioButton Content="{Binding RadioBase}" Margin="0,10,0,0" IsChecked="{Binding BaseCheck}" GroupName="SlotGroup" />                            
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>           
    </Grid>

<Grid Grid.Row="1">            

        <ItemsControl ItemsSource="{Binding Children}" Grid.Column="0">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <ItemsControl Visibility="{Binding IsRegisterItemsVisible, Converter={StaticResource BoolToVisibilityConv}}" ItemsSource="{Binding RegisterLabels}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="50,20,0,0">
                                        <TextBlock Text="{Binding}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>            
    </Grid>

FPGARadioWidgetViewModel类:此处设置该类的DataContext

public ObservableCollection<FPGAViewModel> Children { get; set; }

    public FPGARadioWidgetViewModel()
    {
        Children = new ObservableCollection<FPGAViewModel>();
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x0", ID = 0 });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x40", ID = 1 });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x80", ID = 2 });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0xc0", ID = 3 });            
    }
publicobservableCollection子项{get;set;}
公共FPGARadioWidgetViewModel()
{
Children=新的ObservableCollection();
Add(新的FPGAViewModel(){RadioBase=“Base 0x0”,ID=0});
Add(新的FPGAViewModel(){RadioBase=“Base 0x40”,ID=1});
Add(新的FPGAViewModel(){RadioBase=“Base 0x80”,ID=2});
Add(新的FPGAViewModel(){RadioBase=“Base 0xc0”,ID=3});
}
FPGAViewModel类:

private bool sBaseCheck;
    public bool BaseCheck
    {
        get { return this.sBaseCheck; }
        set
        {
            this.sBaseCheck = value;
            Generatelabels(this, ID);
            this.OnPropertyChanged("BaseCheck");
        }
    }

    private static void Generatelabels(FPGAViewModel currentItem, int index)
    {
        int m_baseRegister = 0;

        if (index == 0)
        {                
            for (int i = 0; i < 0x40 / 8; i++)
            {
                int reg = (i * 8) + m_baseRegister;
                currentItem.RegisterLabels[i] = "Reg 0x" + reg.ToString("X");
                currentItem.IsRegisterItemsVisible = true;
            }
        }
        else if (index == 1)
        {
            m_baseRegister = 0x40 * index;
            for (int i = 0; i < 0x40 / 8; i++)
            {
                int reg = (i * 8) + m_baseRegister;
                currentItem.RegisterLabels[i] = "Reg 0x" + reg.ToString("X");
                currentItem.IsRegisterItemsVisible = true;
            }
        }
        // Similarly for Index 2 and Index = 3
    }

    private string[] registerLabels = new string[8];
    public string[] RegisterLabels { get { return registerLabels; } }

    private bool isRegisterItemsVisible = false;
    public bool IsRegisterItemsVisible
    {
        get { return isRegisterItemsVisible; }
        set
        {
            isRegisterItemsVisible = value;
            OnPropertyChanged("IsRegisterItemsVisible");
            OnPropertyChanged("RegisterLabels");
        }
    }       
private bool sBaseCheck;
公共布尔基线检查
{
获取{返回this.sBaseCheck;}
设置
{
this.sBaseCheck=值;
Generatelabels(此,ID);
此.OnPropertyChanged(“BaseCheck”);
}
}
专用静态void生成器标签(FPGAViewModel currentItem,int索引)
{
int m_基址寄存器=0;
如果(索引==0)
{                
对于(int i=0;i<0x40/8;i++)
{
int reg=(i*8)+m_基址寄存器;
currentItem.RegisterLabels[i]=“Reg 0x”+Reg.ToString(“X”);
currentItem.IsRegisterItemsVisible=true;
}
}
else if(索引==1)
{
m_基址寄存器=0x40*索引;
对于(int i=0;i<0x40/8;i++)
{
int reg=(i*8)+m_基址寄存器;
currentItem.RegisterLabels[i]=“Reg 0x”+Reg.ToString(“X”);
currentItem.IsRegisterItemsVisible=true;
}
}
//对于索引2和索引=3,情况类似
}
私有字符串[]注册表标签=新字符串[8];
公共字符串[]RegisterLabels{get{return RegisterLabels;}}
private bool isRegisterItemsVisible=false;
公共图书馆是可注册的
{
获取{return isRegisterItemsVisible;}
设置
{
isRegisterItemsVisible=值;
OnPropertyChanged(“IsRegisterItemsVisible”);
OnPropertyChanged(“注册标签”);
}
}       

单击radiobutton时,将显示8个标签。当我单击第二个单选按钮时,它会显示另一个8,而不会清除前一个8。基本上一次只能显示所选单选按钮的8个标签。如何实现这一点?

我不确定,但可能是WPF感到困惑,因为您正在为
注册表标签
触发
属性更改
,当数组对象本身没有更改时,只有内容发生了更改

通常,如果您的集合在WPF中的内容发生了更改,您可以使用
可观察集合
,该集合支持
INofityCollectionChanged
,以告知WPF其包含的项何时发生了更改(就像您对
子项
所做的那样)

或者每次在
GenerateLabels
中创建一个新数组,然后在末尾将其分配给
RegisterLabels
属性

另外,为什么你的
GenerateLabels()
方法是静态的?如果它只是一个普通的实例方法,那么就更简洁了,那么您就不必传入
currentItem
index

编辑:第二种方法示例(替换数组)

public string[]寄存器标签{get;private set;}
私有无效生成器标签()
{
字符串[]标签=新字符串[8];
int基址寄存器=0x40*ID;
对于(int i=0;i<8;i++)
{
int reg=(i*8)+基址寄存器;
标签[i]=“Reg 0x”+Reg.ToString(“X”);
}
注册标签=标签;
OnPropertyChanged(“注册标签”);
}

谢谢您的回复。可以用一个示例代码来详细说明吗?我认为这真的会很有帮助:)@SteveWilson这是我第三次看到你要求提供示例代码来做这件事。我已经向你解释了你需要的心态,你需要在你的对象之间建立层次关系来实现这一点。请不要偷懒,不要再要求别人做你的工作@GazTheDestroyer:这确实像预期的那样显示标签:),但当我单击其他3个单选按钮时,似乎不会触发OnPropertyChanged。它只显示第一个按钮的标签。
public string[] RegisterLabels { get; private set; }

private void Generatelabels()
{
    string[] labels = new string[8];
    int baseRegister = 0x40 * ID;

    for (int i = 0; i < 8; i++)
    {
        int reg = (i * 8) + baseRegister;
        labels[i] = "Reg 0x" + reg.ToString("X");
    }

    RegisterLabels = labels;
    OnPropertyChanged("RegisterLabels");
}