Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 无法在动态单选按钮单击的组合框中添加不同的项目_C#_Wpf_Xaml_Dynamic_Mvvm - Fatal编程技术网

C# 无法在动态单选按钮单击的组合框中添加不同的项目

C# 无法在动态单选按钮单击的组合框中添加不同的项目,c#,wpf,xaml,dynamic,mvvm,C#,Wpf,Xaml,Dynamic,Mvvm,我正在wpf应用程序中处理单选按钮和组合框。虽然我是C++开发者,但最近我搬到了C。我的应用程序处理上述组件的动态生成。基本上,我已经在我的应用程序中创建了4个动态单选按钮,单击每个按钮,我应该向我的组合框添加不同的项目。代码如下: XAML: FPGARadioWidgetViewModel类: public ObservableCollection<FPGAViewModel> Children { get; set; } public FPGARadioWidge

我正在wpf应用程序中处理单选按钮和组合框。虽然我是C++开发者,但最近我搬到了C。我的应用程序处理上述组件的动态生成。基本上,我已经在我的应用程序中创建了4个动态单选按钮,单击每个按钮,我应该向我的组合框添加不同的项目。代码如下:

XAML:


FPGARadioWidgetViewModel类:

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 });            
    }
private bool sBaseCheck;
    public bool BaseCheck
    {
        get { return this.sBaseCheck; }
        set
        {
            this.sBaseCheck = value;                
            AddComboItems();
            this.OnPropertyChanged("BaseCheck");
        }
    }    

private ObservableCollection<string> _RegComboList;
    public ObservableCollection<string> RegComboList
    {
        get { return _RegComboList; }
        set
        {
            _RegComboList = value;
            OnPropertyChanged("RegComboList");
        }
    }        

private void AddComboItems()
    {
        int baseRegister = 0x40 * ID;
        ObservableCollection<string> combo = new ObservableCollection<string>();            

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

        RegComboList = new ObservableCollection<String>(combo);
        OnPropertyChanged("RegComboList");
    }


private bool isRegisterItemsVisible = false;
    public bool IsRegisterItemsVisible
    {
        get { return isRegisterItemsVisible; }
        set
        {
            isRegisterItemsVisible = value;
            OnPropertyChanged("IsRegisterItemsVisible");                
            OnPropertyChanged("RegComboList");
        }
    }
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类:

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 });            
    }
private bool sBaseCheck;
    public bool BaseCheck
    {
        get { return this.sBaseCheck; }
        set
        {
            this.sBaseCheck = value;                
            AddComboItems();
            this.OnPropertyChanged("BaseCheck");
        }
    }    

private ObservableCollection<string> _RegComboList;
    public ObservableCollection<string> RegComboList
    {
        get { return _RegComboList; }
        set
        {
            _RegComboList = value;
            OnPropertyChanged("RegComboList");
        }
    }        

private void AddComboItems()
    {
        int baseRegister = 0x40 * ID;
        ObservableCollection<string> combo = new ObservableCollection<string>();            

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

        RegComboList = new ObservableCollection<String>(combo);
        OnPropertyChanged("RegComboList");
    }


private bool isRegisterItemsVisible = false;
    public bool IsRegisterItemsVisible
    {
        get { return isRegisterItemsVisible; }
        set
        {
            isRegisterItemsVisible = value;
            OnPropertyChanged("IsRegisterItemsVisible");                
            OnPropertyChanged("RegComboList");
        }
    }
private bool sBaseCheck;
公共布尔基线检查
{
获取{返回this.sBaseCheck;}
设置
{
this.sBaseCheck=值;
AddComboItems();
此.OnPropertyChanged(“BaseCheck”);
}
}    
私有可观测集合_RegComboList;
公共ObservableCollection RegComboList
{
获取{return\u RegComboList;}
设置
{
_RegComboList=值;
OnPropertyChanged(“RegComboList”);
}
}        
私有void AddComboItems()
{
int基址寄存器=0x40*ID;
ObservableCollection组合=新的ObservableCollection();
对于(int i=0;i<0x40;i++)
{
int reg=(i*8)+基址寄存器;
组合[i]=“0x”+reg.ToString(“X”);
}
RegComboList=新的ObservableCollection(组合);
OnPropertyChanged(“RegComboList”);
}
private bool isRegisterItemsVisible=false;
公共图书馆是可注册的
{
获取{return isRegisterItemsVisible;}
设置
{
isRegisterItemsVisible=值;
OnPropertyChanged(“IsRegisterItemsVisible”);
OnPropertyChanged(“RegComboList”);
}
}
如果您注意到,在单击特定单选按钮时,它应根据ID在combobox中添加具有不同值的项。必须确保在单击任何单选按钮时,仅应添加该单选按钮的项,并且应清除combobox的以前内容。我试图用上面的代码做同样的事情,但调试时combobox中似乎什么都没有出现


请帮助:)

这是因为组合框已绑定到不同的字符串引用。每次单选单击都会更改项目并返回对列表的新引用。尝试通过删除当前RegComboList中的现有项,然后添加新项来重用当前RegComboList。如果无法更新combobox,请双向绑定到RegComboList

编辑:下面是一个.Net 4.5的工作示例,不用担心概念是相同的

在这里,组合框最初加载了5个单词。然后,每当用户单击按钮时,一组新单词就会被放入列表中,从而更改组合框。请注意为集合完成的清除操作

图片是在最初的“Lorem Ipsum”加载之后


代码隐藏

public partial class MainWindow : Window,  INotifyPropertyChanged
{
    private const string cLorem = @"Lorem ipsum dolor sit amet consectetur adipiscing elit Maecenas
                                   et lacinia nisl Aenean nec aliquet risus Phasellus dui purus 
                                   sollicitudin nec cursus vitae cursus id purus Nam quis risus 
                                   velit Sed aliquam tellus in odio pulvinar tincidunt Sed bibendum mi";



    private int Skip { get; set; }
    private ObservableCollection<string> _RegComboList;
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<string> RegComboList
    {
        get { return _RegComboList; }
        set
        {
            _RegComboList = value;
            OnPropertyChanged();
        }
    }


    public MainWindow()
    {
        InitializeComponent();
        RegComboList = new ObservableCollection<string>();
        GenerateWords(5);

        DataContext = this;
    }

    private void GenerateWords(int toTake)
    {
        RegComboList.Clear();

        Regex.Split(cLorem, @"\s+").Skip(Skip)
             .Take(toTake)
             .ToList()
             .ForEach(word => RegComboList.Add( word ));

        Skip += toTake;

    }

    protected virtual void OnPropertyChanged( [CallerMemberName] string propertyName = "" )
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler( this, new PropertyChangedEventArgs( propertyName ) );
        }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        GenerateWords(new Random().Next(1, 10));
    } 
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
private const string cLorem=@“Lorem ipsum door sit amet concetetur adipise elite Maecenas
这是一个非常重要的问题
这是一种新的生活方式
在《我的心愿》中,这是一个很好的例子;
private int Skip{get;set;}
私有可观测集合_RegComboList;
公共事件属性更改事件处理程序属性更改;
公共ObservableCollection RegComboList
{
获取{return\u RegComboList;}
设置
{
_RegComboList=值;
OnPropertyChanged();
}
}
公共主窗口()
{
初始化组件();
RegComboList=新的ObservableCollection();
生成树(5);
DataContext=this;
}
私有void GenerateWords(int-toTake)
{
RegComboList.Clear();
Regex.Split(cLorem,@“\s+”).Skip(Skip)
.拿(toTake)
托利斯先生()
.ForEach(word=>RegComboList.Add(word));
跳过+=toTake;
}
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=”“)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
私有无效按钮\u单击\u 1(对象发送者,路由目标)
{
GenerateWords(newrandom().Next(1,10));
} 
}

我会将组合框的ItemsSource与所选的单选按钮相关联。根据您现有的模型,我将使每个
FPGAViewModel
都有一个
observeCollection
。然后,正如Alex Curtis所说,您将在所选单选按钮和组合框的ItemsSource之间创建一个绑定

看一看post,通过将ItemsControl更改为将列表框与现有的DataTemplate一起使用,可能更容易获得选中的单选按钮。然后可以将IsChecked属性绑定到ListBoxItem.IsSelected

           <ListBox ItemsSource="{Binding Children}" SelectedItem="{Binding YourSelectedItem}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical" >
                            <RadioButton Content="{Binding RadioBase}"  Margin="0,10,0,0"  GroupName="SlotGroup"  Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center">
                                <RadioButton.IsChecked>
                                    <Binding Path="IsSelected"
                                     RelativeSource="{RelativeSource AncestorType=ListBoxItem}" Mode="TwoWay" />
                                </RadioButton.IsChecked>
                            </RadioButton>                            
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>


<ComboBox Visibility="{Binding YourSelectedItem.IsRegisterItemsVisible}" ItemsSource="{Binding YourSelectedItem.RegComboList}" SelectedItem="{Binding YourSelectedItem.SelectedRegComboList, Mode=TwoWay}" SelectedIndex="0" />
要填充您的项目,我将
    private FPGAViewModel _yourSelectedItem;

    public FPGAViewModel YourSelectedItem
    {
        get { return _yourSelectedItem; }
        set { _yourSelectedItem = value;
        OnPropertyChanged("YourSelectedItem");}
    }
public FPGAViewModel(string radioBase, int id)
{
    RadioBase = radioBase;
    ID = id;
    AddComboItems();
}
Children.Add(new FPGAViewModel() { RadioBase = "Base 0x0", ID = 0 });
Children.Add(new FPGAViewModel("Base 0x0", 0));