我有一个像这样的ComboBox
<ComboBox
Grid.Column="1"
Padding="5,0,0,0"
DisplayMemberPath="Description"
SelectedItem="{Binding MaxXXAge, Mode=TwoWay, Converter={StaticResource MaxXXAgeToMaxXXAgeMemberConverter}}"
ItemsSource="{Binding ElementName=SettingsXXScrollViewer, Path=DataContext.MaxXXAgeMemberGroup, Mode=OneWay}" />
但是,初始化后,组合框是空白的。它实际上在这之后工作正常。我可以按预期选择并显示所选项目。这只是第一眼看不起作用。但是,我已经初始化了MaxXXAge并且已经触发了转换器。这是小组
public IReadOnlyList<MaxXXAgeMembers> MaxXXAgeMemberGroup { get { return MaxXXAgeMembers.Options; } }
这是MaxXXAgeMembers的定义
public class MaxXXAgeMembers
{
public MaxXXAge MaxXXAge { get; private set; }
public string Description { get; private set; }
public static readonly IReadOnlyList<MaxXXAgeMembers> Options = new ReadOnlyCollection<MaxXXAgeMembers>(new[]
{
new MaxXXAgeMembers { MaxXXAge = MaxXXAge.OneDay, Description = Strings.SettingSync_OneDay},
.......
});
public static MaxXXAgeMembers FromMaxXXAge(MaxXXAge maxXXAge)
{
return Options.First(option => option.MaxXXAge == maxXXAge);
}
}
//稍后添加了覆盖等号
public override bool Equals(object obj)
{
if (obj == null || !(obj is MaxEmailAgeMembers))
return false;
return ((MaxEmailAgeMembers)obj).Description.Equals(this.Description);
}
public override int GetHashCode()
{
return this.Description.GetHashCode();
}
转换器就像这样
public sealed class MaxEmailAgeToMaxEmailAgeMemberConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return WPSettingsEmailViewModel.MaxEmailAgeMembers.FromMaxEmailAge((MaxEmailAge)value);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return ((WPSettingsEmailViewModel.MaxEmailAgeMembers)value).MaxEmailAge;
}
}
有什么想法吗?
答案 0 :(得分:2)
它是空白的,因为你首先没有选择任何东西。如果我没有弄错,您必须使用SelectedItem
来绑定您的选择,或使用SelectedValue
与 SelectedValuePath
绑定。
我实际上从不使用SelectedValue
自己SelectedValuePath
,所以在初始化ComboBox.ItemSource绑定到的项目集合后 - 例如ObservableCollection<Person> Persons {get; set;}
- 我还设置了所选项属性{ {1}}到集合中的一个值。然后我将ComboBox.SelectedItem绑定到此属性,因此在初始化时它显示预定义的选定值。
我猜您可以使用Person SelectedPerson {get; set;}
和SelectedValue
达到相同的效果,但您必须将它们一起用作described here。
答案 1 :(得分:1)
我使用x:绑定ItemResource并在代码后面添加了ViewModel,并解决了这个问题。
答案 2 :(得分:0)
您ComboBox
不是空白,但它不知道如何呈现您的MaxXXAgeMembers
。您应该使用ItemTemplate
告诉他。对于Ex:
<ComboBox
Grid.Column="1"
Padding="5,0,0,0"
SelectedValue="{Binding MaxXXAge, Mode=TwoWay, Converter={StaticResource MaxXXAgeToMaxXXAgeMemberConverter}}"
ItemsSource="{Binding ElementName=SettingsXXScrollViewer, Path=DataContext.MaxXXAgeMemberGroup, Mode=OneWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Description}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>