【问题标题】:Set ComboBox ViewModel Selected Index Default设置 ComboBox ViewModel 选定索引默认值
【发布时间】:2018-12-26 14:22:16
【问题描述】:

我正在尝试将 ComboBox 绑定到 ViewModel 并将其默认 SelectedIndex 设置为 0 或第一项。

当我在 ViewModel 中设置默认 SelectedIndex 时,它不起作用。

虽然它适用于SelectedItem


XAML

<ComboBox x:Name="cboExample"
          ItemsSource="{Binding Example_Items}"
          SelectedIndex="{Binding Example_SelectedIndex}"
          SelectedItem="{Binding Example_SelectedItem}"

          HorizontalAlignment="Left" 
          Margin="0,0,0,0" 
          VerticalAlignment="Top" 
          Width="105" 
          Height="22"/>

视图模型

注意:我只设置了一个。

public ViewModel()
{
    // ComboBox Defaults

    Example_SelectedIndex = 0; // does not work

    Example_SelectedItem = "item 1"; //works
}

物品来源

public List<string> _Example_Items = new List<string>()
{
    "item 1",
    "item 2",
    "item 3"
};
public List<string> Example_Items
{
    get { return _Example_Items; }
    set
    {
        _Example_Items = value;
        OnPropertyChanged("Example_Items");
    }
}

选定索引

不工作

public int _Example_SelectedIndex { get; set; }

public int Example_SelectedIndex
{
    get { return _Example_SelectedIndex; }
    set
    {
        if (_Example_SelectedIndex == value)
        {
            return;
        }

        _Example_SelectedIndex = value;
        OnPropertyChanged("Example_SelectedIndex");
    }
}

所选项目

作品

public string _Example_SelectedItem { get; set; }

public string Example_SelectedItem
{
    get { return _Example_SelectedItem; }
    set
    {
        if (_Example_SelectedItem == value)
        {
            return;
        }

        _Example_SelectedItem = value;
        OnPropertyChanged("Example_SelectedItem");
    }
}

【问题讨论】:

  • 您是否在 XAML 中同时设置了两个属性(SelectedIndex 和 SelectedItem)?
  • @Babbillumpa 不只是一个,我只是举例说明了。
  • 您是否检查了输出窗口中的绑定错误?
  • @Babbillumpa 我没有看到与此组合框相关的任何错误。
  • 您只能绑定到属性。第一个视图模型有字段。

标签: c# wpf xaml mvvm combobox


【解决方案1】:

您可以在数据加载完成时设置 Example_SelectedIndex,即 Example_Items。

   private _Example_Items;
   public List<string> Example_Items
    {
        get 
        { 
            if(_Example_Items == null)
            {
                loadExampleItems();
            }

            return _Example_Items; 
        }
        set
        {
            _Example_Items = value;
            OnPropertyChanged("Example_Items");
        }
    }

//如果你从服务器获取数据,这将是异步响应方法。

private void loadExampleItems()
{
     var examples = new List<string>()
                    {
                        "item 1",
                        "item 2",
                        "item 3"
                    };

     Example_Items = examples;
     Example_SelectedIndex = Example_Items.FirstOrDefault();
}

【讨论】:

  • 它无法将 Item string 转换为 Index int 所以我使用了 Example_SelectedItem = Example_Items.FirstOrDefault(); 并且它可以工作。但是为什么它不能像我的代码一样与Example_SelectedIndex = 0 一起使用?
  • SelectedIndex 将根据集合中的 seletedItem 更改。如果你设置了 SelectedItem,它也会更新 SelectedIndex,你应该使用 SelectedIndex 作为 OneWay 绑定来知道什么是索引。
【解决方案2】:

不要同时绑定SelectedItemSelectedIndex。这是一个或另一个。这对我来说很好用:

public class ViewModel
{
    public ViewModel()
    {
        Example_SelectedIndex = 0; //unnecessary since the default value of an int is 0
    }

    private List<string> _Example_Items = new List<string>()
    {
        "item 1",
        "item 2",
        "item 3"
    };
    public List<string> Example_Items
    {
        get { return _Example_Items; }
        set { _Example_Items = value; }
    }

    private int _Example_SelectedIndex;
    public int Example_SelectedIndex
    {
        get { return _Example_SelectedIndex; }
        set
        {
            if (_Example_SelectedIndex == value)
                return;

            _Example_SelectedIndex = value;
        }
    }
}

XAML:

<ComboBox x:Name="cboExample"
          ItemsSource="{Binding Example_Items}"
          SelectedIndex="{Binding Example_SelectedIndex}"
          HorizontalAlignment="Left" 
          Margin="0,0,0,0" 
          VerticalAlignment="Top" 
          Width="105" 
          Height="22"/>

顺便说一句,_Example_SelectedIndex 应该是私有字段而不是公共属性。 _Example_Items 也应该是私有的。

【讨论】:

  • @MattMcManis:你试过这个吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 2020-04-21
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多