繁体   English   中英

从WPF Prism MVVM中的VM设置并显示ComboBox中的SelectedItem

[英]Setting and Showing the SelectedItem in ComboBox from VM in WPF Prism MVVM

我正在尝试从我的VM设置一个ComboBox SelectedItem。 我想我已经接近了,但是当从VM进行设置时,我不知道如何在ComboBox中显示SelectedItem。

文本框具有对SelectedItem属性的绑定。 当我运行它时,它的确会在我的文本框中显示星期五,但是组合框仍然为空。 TextBox还显示了我可以在ComboBox中选择的任何值,所以我认为我已经做好了。 我还需要更改以在组合框中显示它吗? 不确定我在代码中犯了一个错误,或者说实话,我只需要做一些我不知道的事情。

示例数据库是WeekDays

WeekDayID    WeekDayShort   WeekDayLong
    1            Sun          Sunday
    2            Mon          Monday
    3            Tue          Tuesday
    4            Wed          Wednesday
    5            Thu          Thursday
    6            Fri          Friday
    7            Sat          Saturday

模特WeekDays.cs:

public partial class WeekDays
{
    public int WeekDayID { get; set; }
    public string WeekDayShort { get; set; }
    public string WeekDayLong { get; set; }
}

ViewModel MainViewModel.cs:

class MainViewModel : BindableBase
{
    private ObservableCollection<WeekDays> _weekDays;
    public ObservableCollection<WeekDays> WeekDays
    {
        get
        {
            return _weekDays;
        }
        set
        {
            SetProperty(ref _weekDays, value);
        }
    }

    private WeekDays _selectedWeekDay;
    public WeekDays SelectedWeekDay
    {
        get
        {
            return _selectedWeekDay;
        }
        set
        {
            SetProperty(ref _selectedWeekDay, value);
        }
    }

    private void FillWeekDays()
    {
        using (NLTrader01Entities nlt = new NLTrader01Entities())
        {
            var q = (from a in nlt.WeekDays select a).ToList();
            WeekDays = new ObservableCollection<WeekDays>(q);
        }
    }

    public MainViewModel()
    {
        FillWeekDays();
        Initialize();
    }

    public void Initialize()
    {
        using (NLTrader01Entities nlt = new NLTrader01Entities())
        {
            SelectedWeekDay = (from a in nlt.WeekDays where a.WeekDayLong == "Friday" select a).Single();
        }
    }
}

还有View.xaml:

<ComboBox
    ItemsSource="{Binding WeekDays}"
    DisplayMemberPath="WeekDayLong"
    SelectedItem="{Binding SelectedWeekDay, Mode=TwoWay}">
</ComboBox>
<TextBox
    Text="{Binding SelectedWeekDay.WeekDayLong, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TextBox>

当您要通过ComboBox的item类的属性值选择一个项目时,应设置SelectedValueSelectedValuePath属性,而不是SelectedItem:

<ComboBox ItemsSource="{Binding WeekDays}"
          DisplayMemberPath="WeekDayLong"
          SelectedValuePath="WeekDayLong"
          SelectedValue="{Binding SelectedWeekDay}"/>

在视图模型中, SelectedWeekDay属性不再是WeekDay实例,而只是一个字符串:

private string _selectedWeekDay;
public string SelectedWeekDay
{
    get { return _selectedWeekDay; }
    set { SetProperty(ref _selectedWeekDay, value); }
}

TextBox绑定如下所示:

<TextBox Text="{Binding SelectedWeekDay, UpdateSourceTrigger=PropertyChanged}"/>

当然,您可以像下面这样在代码中简单地设置它:

SelectedWeekDay = "Friday";

感谢Clemens在这里为我指引正确的方向,给出了两个对我有用的可能答案。

解决方案01:

继续使用SelectedItem并引入SelectedIndex。

ViewModel MainViewModel.cs:

class MainViewModel : BindableBase
{
    private ObservableCollection<WeekDays> _weekDays;
    public ObservableCollection<WeekDays> WeekDays
    {
        get
        {
            return _weekDays;
        }
        set
        {
            SetProperty(ref _weekDays, value);
        }
    }

    private int _selectedIndex;
    public int SelectedIndex
    {
        get
        {
            return _selectedIndex;
        }
        set
        {
            SetProperty(ref _selectedIndex, value);
        }
    }

    private WeekDays _selectedWeekDay;
    public WeekDays SelectedWeekDay
    {
        get
        {
            return _selectedWeekDay;
        }
        set
        {
            SetProperty(ref _selectedWeekDay, value);
        }
    }

    private void FillWeekDays()
    {
        using (NLTrader01Entities nlt = new NLTrader01Entities())
        {
            var q = (from a in nlt.WeekDays select a).ToList();
            WeekDays = new ObservableCollection<WeekDays>(q);
        }
    }

    public MainViewModel()
    {
        FillWeekDays();
        SelectedIndex = 4;        
    }
}

还有View.xaml:

<ComboBox
    ItemsSource="{Binding WeekDays}"
    DisplayMemberPath="WeekDayLong"
    SelectedItem="{Binding SelectedWeekDay}"
    SelectedIndex="{Binding SelectedIndex}">
</ComboBox>
<TextBox
    Text="{Binding SelectedWeekDay.WeekDayLong}">
</TextBox>

解决方案02:

将SelectedIndex和SelectedValue与SelectedValuePath结合使用。

ViewModel MainViewModel.cs:

class MainViewModel : BindableBase
{
    private ObservableCollection<WeekDays> _weekDays;
    public ObservableCollection<WeekDays> WeekDays
    {
        get
        {
            return _weekDays;
        }
        set
        {
            SetProperty(ref _weekDays, value);
        }
    }

    private int _selectedIndex;
    public int SelectedIndex
    {
        get
        {
            return _selectedIndex;
        }
        set
        {
            SetProperty(ref _selectedIndex, value);
        }
    }

    private WeekDays _selectedWeekDay;
    public WeekDays SelectedWeekDay
    {
        get
        {
            return _selectedWeekDay;
        }
        set
        {
            SetProperty(ref _selectedWeekDay, value);
        }
    }

    private void FillWeekDays()
    {
        using (NLTrader01Entities nlt = new NLTrader01Entities())
        {
            var q = (from a in nlt.WeekDays select a).ToList();
            WeekDays = new ObservableCollection<WeekDays>(q);
        }
    }

    public MainViewModel()
    {
        FillWeekDays();
        SelectedIndex = 4;       
    }
}

还有View.xaml:

<ComboBox
    ItemsSource="{Binding WeekDays}"
    DisplayMemberPath="WeekDayLong"
    SelectedValuePath="WeekDayLong"
    SelectedValue="{Binding SelectedWeekDay}"
    SelectedIndex="{Binding SelectedIndex}">
</ComboBox>
<TextBox
    Text="{Binding SelectedWeekDay.WeekDayLong}">
</TextBox>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM