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