【发布时间】:2018-08-02 02:58:10
【问题描述】:
我有一个 ComboBox 包含 1-4 之间的 int 值,还有一个 ListView 包含某个 ItemTemplate。
我正在尝试根据用户的选择重新创建 ListView 行。
因此,如果他选择 1 将有 1 行,如果他选择 3 将有 3 行,依此类推。
这是我的代码:
Xaml:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<ComboBox Name="cbNumOfUnits" Width="40" HorizontalAlignment="Left" ItemsSource="{Binding Numbers}" SelectedIndex="{Binding NumberOfDevices}" >
</ComboBox>
<ListView Margin="10" Name="lvDataBinding" ItemsSource="{Binding Items}" BorderBrush="Transparent">
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<Label Name="lbldeviceName" Width="100" Content="{Binding Name}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="5,5,0,0" />
<xctk:MaskedTextBox x:Name="_maskedTextBox" Width="100" Text="{Binding Address}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Mask="000.000.000.000" />
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
视图模型:
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 );
}
}
}
我的问题是:
- 为什么我的
ComboBox在SelectedIndex中不是以1 开头为默认值,我将numberOfDevices 设置为1。 - 更改
ComboBoxSelectedIndex进入 ViewModel,ListView项目似乎已构建,但它们未在 GUI 中显示。 看起来get { return _itemHandler.Items;}只出现在开头,并且代码不会再次重新进入那里。
谢谢。
【问题讨论】:
-
永远不要使用 SelectedIndex。这是一种可怕的痛苦。始终使用 SelectedItem。
标签: wpf listview mvvm combobox viewmodel