将 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}"/>
所以我有非常简单的 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}"/>