Привязка Grid.Row / Grid.Столбец внутри DataTemplate

#wpf

#wpf #привязка данных #mvvm #прикрепленный-свойства

Вопрос:

Надеюсь, это не обман.

Я хотел бы иметь возможность выполнить следующее в XAML:

 <DataTemplate DataType="{x:Type TestApp:ButtonVM}">        
        <Button 
                Grid.Column="{Binding GridColumn}" 
                Grid.Row="{Binding GridRow}" 
                Content="{Binding Path=Info}" 
        />
</DataTemplate>
  

Привязка содержимого работает нормально, но сетка.Столбец и сетка.Строка просто не существует в созданном объекте. Даже когда я устанавливаю для них какое-то значение без привязки (например, в Grid.Столбец =»1″). Я проверил приложение и увидел, что внутри моей сетки никто никогда не устанавливает сетку.Столбец и Grid.Row.

Есть идеи?

Комментарии:

1. Как вы помещаете свои объекты ButtonVM в сетку? Сетка не является элементом управления items и поэтому не будет принимать произвольные объекты модели представления в качестве своих дочерних элементов.

2. Смотрите ниже, мне удалось сделать это самому. Секрет в том, чтобы использовать ItemsControl . ItemContainerStyle и использовать установщики там, чтобы внедрить привязку в шаблонный дочерний элемент.

Ответ №1:

Решил это сам с помощью блогов.

Насколько я понимаю, вы просто не можете выполнить привязку прикрепленного свойства внутри.

Следующее решает проблему мгновенно (ItemContainerStyle!):

 <DataTemplate DataType="{x:Type TestApp:GridVM}">
        <ItemsControl ItemsSource="{Binding Path=Children}">
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Grid.Row" Value="{Binding GridRow}" />
                    <Setter Property="Grid.Column" Value="{Binding GridColumn}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid ShowGridLines="True"  Style="{Binding Path=Style}">
                        <Grid.RowDefinitions>
                            <RowDefinition Height=".5*" />
                            <RowDefinition Height=".5*" />                            
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width=".5*" />
                            <ColumnDefinition Width=".5*" />
                        </Grid.ColumnDefinitions>                        
                    </Grid>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
</DataTemplate>
  

Комментарии:

1. Ах да. Это должно сработать. Прикрепленная сетка. Строка должна быть непосредственным дочерним элементом сетки.

2. У нас было много проблем с этим, и мы перепробовали много других решений, и это было единственное, которое сработало!!!