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

时间:2015-01-05 05:55:22

标签: wpf xaml mvvm

我正在尝试从ItemsControl中呈现usercontrol,CharacterEditorView。 (使用" Canvas"可以更改ItemsPanelTemplate,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;
        }
    }

我想在一个特定的矩形中呈现EACH CharacterEditorView,这个矩形只在创建viewmodel时才知道。也就是说,每个CharacterEditorView都会有不同的 要呈现的矩形:

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

将EACH CharacterEditorView定位在自己的位置需要什么绑定?

感谢任何想法。

1 个答案:

答案 0 :(得分:1)

如果要绑定TextBlock的Margin,则需要CharacterEditorViewModel中的Thickness类型的可绑定属性,并将其指定为绑定目标(或者,对于更清晰的代码,提供ViewModel中的数字属性,并实现一个ValueConverter,用于创建Thickness实例。

或者,由于ItemsPanelTemplate已定义为Canvas,因此将这些数字属性直接绑定到Canvas.LeftCanvas.Top,正如HighCore所建议的那样。