问题
It's possible to use the ObjectDataProvider
in a WPF application to bind an enum's string values to a ComboBox's ItemsSource, as evidenced in this question.
However, when using a similar snippet in a UWP application, the ff. error message is displayed:
"ObjectDataProvider is not supported in a Windows Universal project."
Is there a simple alternative to do this in UWP?
回答1:
Below is a working example from one of my prototypes.
ENUM
public enum GetDetails
{
test1,
test2,
test3,
test4,
test5
}
ItemsSource
var _enumval = Enum.GetValues(typeof(GetDetails)).Cast<GetDetails>();
cmbData.ItemsSource = _enumval.ToList();
This will bind combobox to Enum Values.
回答2:
If you try to set your SelectedItem via xaml and Bindings, make sure that you set the ItemsSource first!
Example:
<ComboBox ItemsSource="{Binding ...}" SelectedItem="{Binding ...}"/>
回答3:
ComboBox
with ItemSource
to Enum, also with SelectedItem
. And with option to replace Enum's name with custom string (e.g. translation). Respecting MVVM pattern.
Enum:
public enum ChannelMark
{
Undefinned,Left, Right,Front, Back
}
ViewModel
private ChannelMark _ChannelMark = ChannelMark.Undefinned;
public ChannelMark ChannelMark
{
get => _ChannelMark;
set => Set(ref _ChannelMark, value);
}
private List<int> _ChannelMarksInts = Enum.GetValues(typeof(ChannelMark)).Cast<ChannelMark>().Cast<int>().ToList();
public List<int> ChannelMarksInts
{
get => _ChannelMarksInts;
set => Set(ref _ChannelMarksInts, value);
}
XAML
<ComboBox ItemsSource="{x:Bind ViewModel.ChannelMarksInts}" SelectedItem="{x:Bind ViewModel.ChannelMark, Converter={StaticResource ChannelMarkToIntConverter}, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource IntToChannelMarkConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Converters:
switch ((ChannelMark)value)
{
case ChannelMark.Undefinned:
return "Undefinned mark";
case ChannelMark.Left:
//translation
return Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView().GetString("ChannelMarkEnumLeft");
case ChannelMark.Right:
return "Right Channel";
case ChannelMark.Front:
return "Front Channel";
case ChannelMark.Back:
return "Back Channel";
default:
throw new NotImplementedException();
}
public class IntToChannelMarkConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language) => ((ChannelMark)value).ToString();
public object ConvertBack(object value, Type targetType, object parameter, string language) => throw new NotImplementedException();
}
来源:https://stackoverflow.com/questions/39209844/bind-uwp-combobox-itemssource-to-enum