【问题标题】:Binding of a ComboBox SelectedIndex to a ListView ItemsSource将 ComboBox SelectedIndex 绑定到 ListView ItemsSource
【发布时间】: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 );
    }
} 

}

我的问题是:

  1. 为什么我的ComboBoxSelectedIndex 中不是以1 开头为默认值,我将numberOfDevices 设置为1。
  2. 更改 ComboBox SelectedIndex 进入 ViewModel,ListView 项目似乎已构建,但它们未在 GUI 中显示。 看起来get { return _itemHandler.Items;} 只出现在开头,并且代码不会再次重新进入那里。

谢谢。

【问题讨论】:

  • 永远不要使用 SelectedIndex。这是一种可怕的痛苦。始终使用 SelectedItem。

标签: wpf listview mvvm combobox viewmodel


【解决方案1】:

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

  1. 您的ViewModel 没有实现INotifyPropertyChanged
  2. 您应该绑定到SelectedItem,而不是绑定到SelectedIndex。由于 SelectedIndex 是从 0 开始的,而您的 SelectedItem 从 1 开始,因此默认选择第二项。
  3. NumberOfDevices 属性更改时,您不会通知Items 属性已更改。您可以通过在OnPropertyChanged("NumberOfDevices"); 之后添加OnPropertyChanged("Items"); 来解决此问题

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2011-01-14
    • 2019-12-11
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多