我对特定的 xaml 数据绑定有疑问。我有两个列表框(主详细信息,因此列表框的 IsSynchronizedWithCurrentItem 设置为 true)。我希望我的视图模型知道详细信息列表框上的选定项目何时更改:我在视图模型类上创建了一个 int 属性(即我们可以调用此属性 SelInd)并在详细信息视图模型上以这种方式绑定:
SelectedIndex="{Binding Mode=OneWayToSource, Path=SelInd}"
我在运行时没有收到错误/异常,但绑定不会触发:当所选项目更改时,我的视图模型的属性不会更新。如果我将绑定模式更改为 TwoWay 一切正常,但这不是我需要的。我需要它与 OneWayToSource 一起工作(顺便说一句,如果我将 SelectedItem 绑定到 SelectedValue 属性,则同样的非工作行为适用)。
为什么这些绑定不会通过 OneWayToSource 触发?
这是一个更完整的代码示例,只是为了让事情更清楚: 编辑:我无法显示真实代码(NDA),但我会在这里展示一些更简单和类似的东西(Page 的 DataContext 是 PageViewModel 类的一个实例,解释稍后)我只需要我的 viewmodel 类的 SelInd 属性应该始终反映第二个 ListBox 中 SelectedIndex 的值。我找到了执行此操作的替代方法(代码隐藏或附加行为中的事件处理程序),但现在我只是好奇为什么它不适用于 OneWayToSource 绑定。
<Page>
<ContentControl x:Name="MainDataContext">
<Grid DataContext={Binding Path=Masters}>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0"
SelectionMode="Single"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding }">
<ListBox.ItemContainerStyle>
...
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
....
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Grid.Column="1"
SelectionMode="Single"
SelectedIndex="{Binding Mode=OneWayToSource, ElementName=MainDataContext,Path=DataContext.SelInd}"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Details}">
<ListBox.ItemContainerStyle>
...
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
....
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</ContentControl>
</Page>
这是视图模型类的草图
public class PageViewModel{
public ObservableCollection<MasterClass> Masters {get;set;}
public int SelInd {get;set;}
....
}
这是 MasterClass,它只包含一个名称和详细信息列表
public class MasterClass{
public ObservableCollection<DetailsClass> Details {get;set;}
public String MasterName {get;set;}
....
}