我正在使用MVVM,并且正在尝试绑定数组索引。 XAML控件的数据上下文绑定到视图模型。实例化控件时,我将数组索引发送到构造函数中,然后将该索引分配给窗口资源,以便XAML可以直接使用它。该值正按预期传递给构造函数,我可以在XAML页的其他区域中使用它,但是由于某些原因,它将不能用作数组索引。有人知道这里发生了什么吗?
c#:
public partial class MyControl : UserControl {
public MyControl(int index) {
MyIndex = index;
InitializeComponent();
}
private int myIndex;
public int MyIndex {
get { return myIndex; }
set { myIndex = value; }
}
private void Mygrid_OnLoaded(object sender, System.Windows.RoutedEventArgs e) {
Resources["myResourceKey"] = MyIndex;
}
}
这是xaml:
定义资源:
<UserControl.Resources>
<sys:Int32 x:Key="myResourceKey"></sys:Int32>
</UserControl.Resources>
这不起作用。我收到绑定错误,因为它无法识别索引
<GradientStop Color="{Binding MyObservableCollection[DynamicResource myResourceKey].ColorsBo.PageBackgroundPrimary}" Offset="1"/>
这确实起作用,因此资源值正在传递到xaml中:
<Label Grid.Column="0" Content="{DynamicResource myResourceKey}"/>
答案 0 :(得分:2)
以下XAML无效:
MyObservableCollection[DynamicResource myResourceKey]
DynamicResource myResourceKey
必须替换为 constant 常量,例如1
或'abc'
。
另一种选择是按照@Martin Zikmund的建议在视图模型中执行查找,或者使用同时绑定到myResourceKey
和MyObservableCollection
的多重绑定和多重转换器:
https://blog.csainty.com/2009/12/wpf-multibinding-and.html
答案 1 :(得分:1)
恐怕这不是受支持的语法-Binding
确实支持嵌套表达式,但是我认为它们必须是属性的整个“值”(例如Source={StaticResource something}
等) 。在这种情况下,您需要在绑定的Path
属性内使用嵌套表达式,但我认为这不起作用。
为什么您需要绑定数组索引,而又不能创建一个单独的属性来从视图模型中返回MyObservableCollection[index]
项目呢?
public Item => MyObservableCollection[MyIndex];
在XAML中:
<GradientStop Color="{Binding Item.ColorsBo.PageBackgroundPrimary}" Offset="1"/>