【问题标题】:Combo box binding in mvvmmvvm 中的组合框绑定
【发布时间】:2023-03-05 22:22:01
【问题描述】:

我无法找出为什么组合框绑定不起作用?

我有一个看起来像(2 个属性)的视图模型

    public ProcessMaintenanceDataObject CurrentProcess
    {
        get
        {
            return _CurrentProcess;
        }
        set
        {
            _CurrentProcess = value;
            OnPropertyChanged("CurrentProcess");
        }
    }

    public ObservableCollection<ProcessMaintenanceDataObject > Processes 
    {
        get
        {
            return _Processes;
        }
        set
        {
            _Processes = value;
            OnPropertyChanged("Processes");
        }
    }

    public ObservableCollection<FolderInfo> Folders
    {
        get
        {
            return _folders;
        }
        set
        {
            _folders = value;
            OnPropertyChanged("Folders");
        }
    }

以下是ProcessMaintenanceDataObject定义

    [DataMember]
    public string ProcessName
    {
        get
        {
            return _ProcessName;
        }
        set
        {
            _ProcessName = value;
            OnPropertyChanged("ProcessName");
        }

    }


    [DataMember]
    public string Id
    {
        get
        {
            return _Id;
        }
        set
        {
            _Id = value;
            OnPropertyChanged("Id");
        }
    }

    [DataMember]
    public string FolderId
    {
        get
        {
            return _FolderId;
        }
        set
        {
            _FolderId = value;
            OnPropertyChanged("FolderId");
        }
    }

    [DataMember]
    public FolderInfo Folder
    {
        get
        {
            return _Folder;
        }
        set
        {
            _Folder = value;
            if (_Folder != null)
                FolderId = _Folder.FolderId;
            OnPropertyChanged("Folder");
        }
    }

FolderInfo 类具有 FolderName 和 FolderId 属性。

我在视图模型中有一个填充进程的方法。 在我看来,我的结构类似于,我有一个将绑定到进程的树视图,并且在从树视图中选择任何项目时,我需要允许用户编辑该实体。

在视图中组合框绑定如下:

<ComboBox ItemsSource="{Binding Path=Folders, Mode=OneWay}"
          DisplayMemberPath="FolderName" 
          SelectedItem="{Binding  Source={StaticResource viewModel}, Path=CurrentProcess.Folder, Mode=TwoWay}">
...

此绑定不起作用我的意思是当我从树中选择任何对象时,它会填充文本框中的 ProcesName 等其他信息,但它不会将文件夹对象作为组合框中的选定项目,但是组合框将是填满。

任何建议。

请参考:

【问题讨论】:

  • 什么是FolderCollection
  • FolderCollection 是 FolderInfo 的 ObservableCollection。 FolderInfo 是一个具有两个属性 FolderName 和 FolderId 的类。
  • 你也可以粘贴填充进程的方法吗?
  • ` private void RefreshProcessess() { Client.GetProcessesCompleted += (sndr, args) => { try { Processes = args.Result; } 捕捉(异常){ } }; Client.GetProcessesAsync(); }`

标签: c# .net wcf silverlight mvvm


【解决方案1】:

如果您想以具有编辑支持的双向模式将 ComboBox 绑定到您的文件夹属性, 然后你应该为你的组合框定义数据模板,然后将 FolderInfo 类的属性绑定到这些文本框 绑定显示成员路径并不能解决你的问题

【讨论】:

  • 我已将 ComboBox 的 ItemsSource 绑定到文件夹。我不想打扰文件夹集合我的意思是我不想编辑 FolderInfo。
  • 我没有看过你的视图模型,这并不重要仅在 [显示成员路径] 内,您将无法修改 ComboBox 中的任何内容,它只会向您显示数据,没有任何改变有界数据的机制。
  • 如果你有任何错误,然后把错误信息放在这里,但是如果你尝试过@anatollig的示例,并且你的组合框仍然是只读的,那么你没有问题,没有需要在该示例上堆叠面板,并且您应该使用文本框而不是文本区域。
【解决方案2】:

我建议您将DisplayMemberPath 更改为适当的DataTemplate

<DataTemplate>
  <StackPanel>
     <TextBlock Text="{Binding FolderName}">
  </StackPanel>
<DataTemplate>

这将修复 SelectedItem 上下文。

【讨论】:

  • 它也不起作用我将组合框更改为:&lt;ComboBox ItemsSource="{Binding Path=Folders, Mode=OneWay}" SelectedItem="{Binding Source={StaticResource viewModel}, Path=CurrentProcess.Folder, Mode=TwoWay}"&gt; &lt;ComboBox.ItemTemplate&gt; &lt;DataTemplate&gt; &lt;StackPanel&gt; &lt;TextBlock Text="{Binding FolderName}"/&gt; &lt;/StackPanel&gt; &lt;/DataTemplate&gt; &lt;/ComboBox.ItemTemplate&gt; &lt;/ComboBox&gt;
【解决方案3】:

也许只是也许,您的 Folderinfo 类不是一个通知对象。如果是这种情况,请确保它实现了 INotifyPropertyChange。

【讨论】:

  • 它实现了INotifyPropertyChanged接口。
【解决方案4】:

您必须使用 SelectedValuePath 和 SelectedValue 而不是 SelectedItem,如下所示,

<ComboBox ItemsSource="{Binding Path=Folders, Mode=OneWay}"
          DisplayMemberPath="FolderName"
          SelectedValuePath="FolderId" 
          SelectedValue="{Binding Path=FolderId, Mode=TwoWay}">

SelectedItem 绑定整个对象,而 SelectedValue 仅绑定对象的特定属性。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2018-06-12
    • 2015-09-15
    • 1970-01-01
    • 2021-10-11
    • 2015-07-11
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多