将 ComboBox 的 SelectedValue 分配给 viewmodel wpf 的字符串 属性

Assigning SelectedValue of ComboBox to a string property of viewmodel wpf

所以我有非常简单的 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?

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

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

如果您希望所选名称调用 MyDetail.Name,它将 return 您的字符串

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

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