如何从 ItemsControl(在 MVVM 中)唯一定位用户控件?

How to uniquely position usercontrols from an ItemsControl (in MVVM)?

我正在尝试从 ItemsControl 中显示用户控件 CharacterEditorView。 (在ItemsPanelTemplate中使用"Canvas"可以改,Grid?)。 CharacterEditorView 是叠加在字符串之上的,所以位置很关键。 ItemsControl 是:

    <ItemsControl Grid.Row="0" Grid.RowSpan="1" ItemsSource="{Binding CharacterPads}" >
                   <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemContainerStyle>
                        <Style>
                            <Setter Property="Control.Margin" Value="{Binding Margin}"/>
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>

其中 CharacterPads 的绑定定义为:

   private ObservableCollection<CharacterEditorViewModel> characterPads = new ObservableCollection<CharacterEditorViewModel>();
    public ObservableCollection<CharacterEditorViewModel> CharacterPads
    {
        get
        {
            return characterPads;
        }
    }

我想在仅在其视图模型创建时已知的特定矩形内呈现每个 CharacterEditorView。也就是说,每个 CharacterEditorView 都会有不同的 矩形显示在:

<UserControl x:Class="Nova5.UI.Views.CharacterEditorView"
       .................................................................
     <Grid Background="Red">
        <TextBlock Text="TextBlock" Margin="{Binding ...?????}" />
     </Grid>
</UserControl>

需要什么绑定才能将每个 CharacterEditorView 定位在自己的位置?

感谢任何想法。

如果您想要绑定 TextBlock 的 Margin,您需要 CharacterEditorViewModel 中一些 Thickness 类型的可绑定 属性 并将其指定为绑定目标(或,为了更简洁的代码,在 ViewModel 中提供数字属性并实现一个 ValueConverter,从中创建一个 Thickness 实例)。

或者,由于 ItemsPanelTemplate 已被定义为 Canvas,请按照 HighCore 的建议将这些数字属性直接绑定到 Canvas.LeftCanvas.Top