繁体   English   中英

组合框ItemSource不与ViewModel的数据绑定

[英]Combobox ItemSource not binding with data from ViewModel

我有一个组合框:

<ComboBox   Height="23" 
            Name="DriveSelection" Width="120"
            ItemsSource="{Binding Path=FixedDrives}"
            DisplayMemberPath="fixedDrives"
            SelectedItem="{Binding Path=DriveSelection_SelectionChanged}"
            IsSynchronizedWithCurrentItem="True"/>

这是ItemsSource的代码:

private ObservableCollection<DriveInfo> fixedDrives;
public ObservableCollection<DriveInfo> FixedDrives
{
    get
    {
        if(fixedDrives==null)
        {
           var query =
                from driveInfo in DriveInfo.GetDrives()
                //where driveInfo.DriveType == DriveType.Fixed
                select driveInfo;
           fixedDrives= new ObservableCollection<DriveInfo>(query);
           return fixedDrives;
        }

        return fixedDrives;
    }
}

这里是事件处理程序:

private void DriveSelection_SelectionChanged()
{
    if (page.DriveSelection.IsEnabled)
    {
        this.UpdatePathManager();
    }
}

我检查similiar问题, 像这样的一个这一个 ,并没有发现有任何答案。

我知道ViewModel必须绑定到View。 其他绑定到按钮等正在起作用。

更新后:

private DriveInfo driveSelection;
public DriveInfo DriveSelection_SelectionChanged
{
    get
    {
        return driveSelection;
    }
    set
    {
        if (value == driveSelection) return;
        driveSelection = value; 
        NotifyOfPropertyChange(() => UpdatePathManager()); //UpdatePatchmanager is my function and it exists.
        //Notify... throws does not exists in currenct context
    }
}

XAML:

<ComboBox  Height="23" 
           Name="DriveSelection" 
           Width="120" 
           ItemsSource="{Binding Path=FixedDrives}" 
           DisplayMemberPath="Name" 
           SelectedItem="{Binding Path=DriveSelection_SelectionChanged}" 
           IsSynchronizedWithCurrentItem="True" />

并绑定ViewModel:

public PathSelectionPage()
{
    InitializeComponent();
    this.DataContext = new PathSelectionPageViewModel(this);
}

在所有更新之后,Combobox仍然没有任何选择,并且显示为灰色。

并且NotifyOfPropertyChange does not exists in current context抛出:

class PathSelectionPageViewModel : ObservableObject, INavigable, INotifyPropertyChanged

DisplayMemberPath应该是DriveInfo类中的属性名称,而不是DisplayMemberPath="fixedDrives"SelectedItem应该是DriveInfo类型的VM上的属性,而不是函数

您的DisplayMemberPath应该是您的集合的属性,而不是集合本身。

从此到:

 DisplayMemberPath="fixedDrives"

像这样的东西:

<ComboBox Height="23" 
        Name="DriveSelection" Width="120"
        ItemsSource="{Binding Path=FixedDrives}"
        DisplayMemberPath="Property1"
        SelectedItem="Property"
        IsSynchronizedWithCurrentItem="True"/>

您不需要写事件处理程序,因为它也不是MVVM方式。 你必须写这样的东西

   <ComboBox Height="23" 
        Name="DriveSelection" Width="120"
        ItemsSource="{Binding Path=FixedDrives}"
        DisplayMemberPath="PropertyOfDriveInfo"
        SelectedItem="{Binding Path=SelectedInfo}" />

class ViewModel: INotifyPropertyChanged
{
    private ObservableCollection<DriveInfo> fixedDrives;
    public ObservableCollection<DriveInfo> FixedDrives
    {
        get
        {
            if(fixedDrives==null)
            {
               var query =
                from driveInfo in DriveInfo.GetDrives()
                //where driveInfo.DriveType == DriveType.Fixed
                select driveInfo;
               fixedDrives= new ObservableCollection<DriveInfo>(query);
               return fixedDrives;
            }
            return fixedDrives;
         }
    }

    private DriveInfo _selectedInfo
    public DriveInfo SelectedInfo
    {
        get { return _electedInfo; }
        set
        {
            if (value == _electedInfo) return;
            _selectedInfo= value;
            NotifyOfPropertyChange(() => SelectedInfo);//must be implemented
        }
    }
}

暂无
暂无

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

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