Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
Wpf 将选定的组合框索引绑定到ListView项源_Wpf_Listview_Mvvm_Combobox_Viewmodel - Fatal编程技术网

Wpf 将选定的组合框索引绑定到ListView项源

Wpf 将选定的组合框索引绑定到ListView项源,wpf,listview,mvvm,combobox,viewmodel,Wpf,Listview,Mvvm,Combobox,Viewmodel,我有一个组合框,其中包含1-4之间的int值,还有一个列表视图,其中包含某个项目模板。 我正在尝试根据用户的选择重新创建ListView行。 因此,如果他选择1,将有1行,如果他选择3,将有3行,以此类推。 这是我的密码: Xaml: 视图模型: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using Sys

我有一个
组合框
,其中包含1-4之间的
int
值,还有一个
列表视图
,其中包含某个
项目模板
。 我正在尝试根据用户的选择重新创建
ListView
行。 因此,如果他选择1,将有1行,如果他选择3,将有3行,以此类推。 这是我的密码:

Xaml:


视图模型:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace App3
{
public class ViewModel
{ 
    private ItemHandler _itemHandler;

    public ViewModel()
    {
        _itemHandler = new ItemHandler();
        _itemHandler.Add( new Item() { Name = "Master", Address = "" } );
        numberOfDevices = 1;
        OnPropertyChanged( "NumberOfDevices" );

        numbers = new ObservableCollection<int>();

        for( int i = 0; i < 4; i++ )
        {
            numbers.Add( i + 1 );
        }
    }


    ObservableCollection<int> numbers;
    public ObservableCollection<int> Numbers 
    {
        get { return numbers; }
        set
        { 
            OnPropertyChanged( "Numbers" );
        }
    }


    public List<Item> items;
    public List<Item> Items
    {
        get { return _itemHandler.Items; }
    }


    private int numberOfDevices = 1;
    public int NumberOfDevices
    {
        get
        {
            return numberOfDevices;
        }
        set
        {
            if( value != numberOfDevices )
            {
                numberOfDevices = value;

                string name = null;


                _itemHandler = new ItemHandler();

                for( int i = 0; i < numberOfDevices + 1; i++ )
                {
                    if( i == 0 )
                    {
                        name = "Master";
                    }
                    else
                    {
                        name = "Slave" + i;
                    }

                    _itemHandler.Add( new Item() { Name = name, Address = "" } );
                }


                OnPropertyChanged( "NumberOfDevices" ); 
            }
        }

    }


    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged( string propertyName )
    {
        if( null != PropertyChanged )
        {
            PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
        }
    }

}



public class Item
{ 
    public string Name { get; set; }
    public string Address { get; set; }
}



public class ItemHandler
{
    public ItemHandler()
    {
        Items = new List<Item>();
    }

    public List<Item> Items { get; private set; }

    public void Add( Item item )
    {
        Items.Add( item );
    }
} 

}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间App3
{
公共类视图模型
{ 
私有ItemHandler\u ItemHandler;
公共视图模型()
{
_itemHandler=新的itemHandler();
_添加(新项(){Name=“Master”,Address=”“});
设备数量=1;
关于财产变更(“设备数量”);
数字=新的ObservableCollection();
对于(int i=0;i<4;i++)
{
增加(i+1);
}
}
可观测收集数;
公共可观测收集编号
{
获取{返回数字;}
设置
{ 
不动产变更(“编号”);
}
}
公共清单项目;
公共清单项目
{
获取{return\u itemHandler.Items;}
}
专用int numberOfDevices=1;
公共int数字设备
{
得到
{
返回设备数量;
}
设置
{
如果(值!=设备数)
{
设备数量=价值;
字符串名称=null;
_itemHandler=新的itemHandler();
对于(int i=0;i
我的问题是:

  • 为什么我的
    组合框
    SelectedIndex
    中不以1开头作为deafult,我将numberOfDevices设置为1
  • 更改
    组合框
    SelectedIndex
    进入ViewModel时,
    列表视图
    项似乎已生成,但它们未显示在GUI中。 它看起来像
    get{return\u itemHandler.Items;}
    只在开始时出现,代码不会再次进入那里

  • 谢谢。

    如果您修复了代码中的以下问题,它将正常工作:

  • 您的
    ViewModel
    未实现
    INotifyPropertyChanged
  • 您应该绑定到
    SelectedItem
    ,而不是绑定到
    SelectedIndex
    。由于
    SelectedIndex
    基于0,并且您的
    SelectedItem
    从1开始,因此默认情况下选择了第二项
  • NumberOfDevices
    属性更改时,您不会通知
    Items
    属性已更改。您可以通过添加
    OnPropertyChanged(“Items”)来修复此问题在属性更改(“NumberOfDevices”)后

  • 如果您修复了代码中的以下问题,它将起作用:

  • 您的
    ViewModel
    未实现
    INotifyPropertyChanged
  • 您应该绑定到
    SelectedItem
    ,而不是绑定到
    SelectedIndex
    。由于
    SelectedIndex
    基于0,并且您的
    SelectedItem
    从1开始,因此默认情况下选择了第二项
  • NumberOfDevices
    属性更改时,您不会通知
    Items
    属性已更改。您可以通过添加
    OnPropertyChanged(“Items”)来修复此问题在属性更改(“NumberOfDevices”)后

  • 切勿使用SelectedIndex。这是一种可怕的痛苦。总是使用SelectedItem。永远不要使用SelectedIndex。这是一种可怕的痛苦。总是使用SelectedItem。
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace App3
    {
    public class ViewModel
    { 
        private ItemHandler _itemHandler;
    
        public ViewModel()
        {
            _itemHandler = new ItemHandler();
            _itemHandler.Add( new Item() { Name = "Master", Address = "" } );
            numberOfDevices = 1;
            OnPropertyChanged( "NumberOfDevices" );
    
            numbers = new ObservableCollection<int>();
    
            for( int i = 0; i < 4; i++ )
            {
                numbers.Add( i + 1 );
            }
        }
    
    
        ObservableCollection<int> numbers;
        public ObservableCollection<int> Numbers 
        {
            get { return numbers; }
            set
            { 
                OnPropertyChanged( "Numbers" );
            }
        }
    
    
        public List<Item> items;
        public List<Item> Items
        {
            get { return _itemHandler.Items; }
        }
    
    
        private int numberOfDevices = 1;
        public int NumberOfDevices
        {
            get
            {
                return numberOfDevices;
            }
            set
            {
                if( value != numberOfDevices )
                {
                    numberOfDevices = value;
    
                    string name = null;
    
    
                    _itemHandler = new ItemHandler();
    
                    for( int i = 0; i < numberOfDevices + 1; i++ )
                    {
                        if( i == 0 )
                        {
                            name = "Master";
                        }
                        else
                        {
                            name = "Slave" + i;
                        }
    
                        _itemHandler.Add( new Item() { Name = name, Address = "" } );
                    }
    
    
                    OnPropertyChanged( "NumberOfDevices" ); 
                }
            }
    
        }
    
    
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged( string propertyName )
        {
            if( null != PropertyChanged )
            {
                PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
            }
        }
    
    }
    
    
    
    public class Item
    { 
        public string Name { get; set; }
        public string Address { get; set; }
    }
    
    
    
    public class ItemHandler
    {
        public ItemHandler()
        {
            Items = new List<Item>();
        }
    
        public List<Item> Items { get; private set; }
    
        public void Add( Item item )
        {
            Items.Add( item );
        }
    } 
    
    }