【问题标题】:Assigning SelectedValue of ComboBox to a string property of viewmodel wpf将 ComboBox 的 SelectedValue 分配给 viewmodel wpf 的字符串属性
【发布时间】:2017-04-23 12:43:14
【问题描述】:

所以我有非常简单的combobox 包含值列表。我应该将selectedvalue 绑定到viewmodel 属性并将其存储在数据库中。以下是我目前的做法:

SampleViewModel.cs

public class SampleViewModel: BindableBase
{
    public SampleViewModel()
    {
        MyDetails = new ObservableCollection<DetailItems>(){
            new DetailItems{Name="Detail1"},
            new DetailItems{Name = "Detail2"},
            new DetailItems{Name= "Detail3"},
            new DetailItems{Name="Detail4"}
        };
    }

    private ObservableCollection<DetailItems> _myDetails;
    private string _myDetail;

    public ObservableCollection<DetailItems> MyDetails { get { return _myDetails; } set { SetProperty(ref _myDetails, value); } }
    public string MyDetail { get { return _myDetail; } set { SetProperty(ref _myDetail, value); } }
}

public class DetailItems: BindableBase
{
    private string _name;
    public string Name { get { return _name; } set { SetProperty(ref _name, value); } }
}

我在View中的ComboBox如下

<ComboBox x:Name="cbDetails" 
                  ItemsSource="{Binding MyDetails}" 
                  DisplayMemberPath="Name" 
                  SelectedValuePath="{Binding Path=Name}" 
                  SelectedValue="{Binding MyDetail}"/>

但是每当我在后端获取数据时,字符串MyDetail 将有一个DetailItems 实例转换为string。谁能告诉我如何更改它以将适当的值绑定到MyDetail?

【问题讨论】:

  • 您不应该在 SelectedValuePath 中使用绑定。如果您希望值为 Name(就像您已经在 DisplayMemberPath 中所做的那样),请在此处使用 Name。
  • @Evk.. 完美的伙伴.. 非常感谢您的快速回复.. 您能否将其添加为答案?

标签: c# wpf mvvm combobox prism


【解决方案1】:

原因很简单:SelectedValuePath 期望指向对象属性的路径,而不是绑定(就像DisplayMemberPath 一样)。所以解决方法是:

<ComboBox x:Name="cbDetails" 
          ItemsSource="{Binding MyDetails}" 
          DisplayMemberPath="Name" 
          SelectedValuePath="Name" 
          SelectedValue="{Binding MyDetail}"/>

【讨论】:

    【解决方案2】:

    显然,SelectedValue 始终只保存当前选定的项目。因此,您必须将类型从字符串更改为 DetailItems,如下所示,

    private DetailItems_myDetail;
     public DetailItems MyDetail { get { return _myDetail; } set { SetProperty(ref _myDetail, value); } }
    }
    

    如果您想要选择的名称调用 MyDetail.Name,它将返回您的字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2018-02-14
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多