我正在尝试将我的ListPicker绑定到ObservableCollection中的TimeSpan.Days属性,我也使用Converter来格式化字符串,但我无法使绑定工作。我没有得到任何错误,但ListPicker没有任何项目,我的转换器中的代码不会被执行(断点永远不会被命中)。
我发现如果我绑定到这样的集合:
ItemsSource="{Binding Converter={StaticResource intervalConverter}}"
然后我的转换器中的代码会被执行,但转换函数的“value”参数是整个集合,而不是集合中的单个项目。
有谁可以解释为什么我的绑定不起作用?
这是我的XAML:
<toolkit:ListPicker x:Name="intervalPicker"
ExpansionMode="ExpansionAllowed"
ItemsSource="{Binding Days, Converter={StaticResource intervalConverter}}"/>
这是我背后的代码:
public partial class MainPage : PhoneApplicationPage
{
ObservableCollection<TimeSpan> _intervals;
// Constructor
public MainPage()
{
InitializeComponent();
PopulatePicker();
}
private void PopulatePicker()
{
//Insulin Interval Picker
_intervals = new ObservableCollection<TimeSpan>();
_intervals.Add(new TimeSpan(1, 0, 0, 0));
_intervals.Add(new TimeSpan(2, 0, 0, 0));
_intervals.Add(new TimeSpan(3, 0, 0, 0));
intervalPicker.DataContext = _intervals;
}
}
public class IntervalConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int interval = (int)value;
if(interval > 1)
return string.Format("{0 days}", interval);
else
return string.Format("{0 day}", interval);
}
}
答案 0 :(得分:1)
您需要将转换器移动到ListPicker的ItemTemplate。如果你将它与ItemsSource绑定一起使用,那么你告诉框架你需要转换用于items集合的值(这就是整个集合被传递给你的转换器的原因)。
编辑:转换器代码也需要更改。格式字符串应为“{0}天”而不是“{0天}”
这是一些应该接近你想要的xaml:
<toolkit:ListPicker x:Name="intervalPicker"
ExpansionMode="ExpansionAllowed"
ItemsSource="{Binding}">
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Days, Converter={StaticResource intervalConverter}"/>
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<TextBlock Style={StaticResource PhoneTextTitle2Style}"
Text="{Binding Path=Days, Converter={StaticResource intervalConverter}"/>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>