2016-12-08 61 views
1

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

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); } } 
} 

和我ViewComboBox如下

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

但每当我在后台获取数据,该字符串MyDetail将有DetailItems的一个实例转换为string。任何人都可以让我知道我可以如何改变这个绑定适当的值到MyDetail

+0

你不应该使用SelectedValuePath内的绑定。如果您希望将值设为Name,则只需使用Name即可(与您已在DisplayMemberPath中执行的操作一样)。 – Evk

+0

@Evk ..完美的伙伴..非常感谢您的快速回复..您可以添加它作为答案吗? –

回答

1

的原因很简单: SelectedValuePath预计路径为对象的属性,而不是绑定(就像DisplayMemberPath一样)。所以一个修复将是:

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

非常感谢您的答案.. :) –

0

显然,SelectedValue始终仅保存当前选定的项目。所以,你必须从字符串类型更改为DetailItems如下,

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

,如果你想选择的名字叫MyDetail.Name将返回您的字符串

+0

谢谢你的努力+ 1。:) –