0

I am working on dynamic generation of labels based on radiobutton click. Well I have been succesful in doing it but everytime I click a button, it generates labels but doesnt clear the previous state. Here is the code:

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 Class: DataContext of this class is set here

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 });            
    }

FPGAViewModel Class:

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");
        }
    }       

On radiobutton click, it displays 8 labels. When i click second radiobutton, it displays another 8 and doesn't clear the previous 8. Basically at one time only 8 labels of selected radiobutton must be displayed. How can that be achieved?

4

1 に答える 1

1

よくわかりませんが、配列オブジェクト自体が変更されていない場合、コンテンツのみが変更されているため、PropertyChangedWPFが混乱している可能性があります。RegisterLabels

通常、WPF でコンテンツが変化するコレクションがある場合は、ObservableCollection代わりにを使用します。これはINofityCollectionChanged、含まれているアイテムが変更されたときに WPF に通知することをサポートします ( の場合と同様Children) 。

それか、毎回新しい配列を作成し、最後GenerateLabelsにそれをRegisterLabelsプロパティに割り当てます。

ps。なぜあなたのGenerateLabels()メソッドは静的ですか? 通常のインスタンス メソッドである場合は、はるかにクリーンになります。その場合、 and を渡す必要はありませcurrentItemindex

編集:2番目の方法の例(配列を置き換える)

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");
}
于 2012-11-01T14:00:39.190 に答える