我的应用中有一系列项目,我想将Content
的{{1}}设置为其中一项。该项目将由ContentPresenter
索引随机定义。我可以绑定这样的项目:
int
但不是这样的:
<ContentPresenter Content={Binding Items[0]}/>
我已经看到一些建议在WPF中使用<ContentPresenter Content={Binding Items[{Binding Index}]}/>
的答案,但这在UWP中是不可用的。还有其他选择吗?
答案 0 :(得分:1)
您可以创建一个视图模型属性,返回Items[Index]
:
public string RandomItem => Items[Index];
要使PropertyChanged
通知正常工作,您需要在Index
或Items
更改时提升事件,例如:
public int Index
{
get { return _index; }
set
{
_index = value;
RaisePropertyChanged();
RaisePropertyChanged(() => RandomItem);
}
}
如果您希望在视图中使用逻辑并采用多重绑定方式,则可以使用Cimbalino toolkit。为此,首先添加2个NuGet包:
现在你可以创建一个转换器:
public class CollectionIndexConverter : MultiValueConverterBase
{
public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var collection = (IList) values[0];
var index = (int?) values[1];
return index.HasValue ? collection[index.Value] : null;
}
public override object[] ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new System.NotImplementedException();
}
}
从XAML使用它:
<ContentPresenter>
<interactivity:Interaction.Behaviors>
<behaviors:MultiBindingBehavior PropertyName="Content" Converter="{StaticResource CollectionIndexConverter}">
<behaviors:MultiBindingItem Value="{Binding Items}" />
<behaviors:MultiBindingItem Value="{Binding Index}" />
</behaviors:MultiBindingBehavior>
</interactivity:Interaction.Behaviors>
</ContentPresenter>