如何在 ObservableCollection 构建的视图中动态设置用户控件的网格。column/row
How to dynamiclly set the grid.column/row of a UserControl in a view build by ObservableCollection
我正在尝试在 UserControl 中查看包含我自己的 class 类型 "NodViewModel" 的 ObservableCollection。 UserControl 具有行和列定义,我想做的是动态地将每个 NodViewModel 的 Grid.Column 和 Row -属性 设置为 NodView(也是用户控件)。像这样:
<UserControl x:Class="TestarDataBinding.Views.KlassView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:m="clr-namespace:TestarDataBinding.Models"
xmlns:vm="clr-namespace:TestarDataBinding.ViewModels"
xmlns:v="clr-namespace:TestarDataBinding.Views"
mc:Ignorable="d"
Height="110" Width="110"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50*"/>
<RowDefinition Height="50*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
---"Foreach in ObservableCollection<NodViewModel>"---
<v:NodView DataContext="{Binding NodModel}"
Grid.Column="{Binding Position.Column}"
Grid.Row="{Binding Position.Row}" />
---"endforeach"---
</Grid>
您可以使用 Itemscontrol 并将 ObservableCollection 绑定到该 itemscontrol 的 itemsource
这解决了
<ItemsControl ItemsSource="{Binding NodKlassRepository}"
ItemTemplate="{StaticResource NodTemplate}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="10*"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row" Value="{Binding NodKlassModel.Row}"></Setter>
<Setter Property="Grid.Column" Value="{Binding NodKlassModel.Column}"></Setter>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
在 NodTemplate 中:
<DataTemplate x:Key="NodTemplate" DataType="{x:Type vm:NodKlassViewModel}">
<v:NodKlassView DataContext="{Binding}"/>
</DataTemplate>
我正在尝试在 UserControl 中查看包含我自己的 class 类型 "NodViewModel" 的 ObservableCollection。 UserControl 具有行和列定义,我想做的是动态地将每个 NodViewModel 的 Grid.Column 和 Row -属性 设置为 NodView(也是用户控件)。像这样:
<UserControl x:Class="TestarDataBinding.Views.KlassView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:m="clr-namespace:TestarDataBinding.Models"
xmlns:vm="clr-namespace:TestarDataBinding.ViewModels"
xmlns:v="clr-namespace:TestarDataBinding.Views"
mc:Ignorable="d"
Height="110" Width="110"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50*"/>
<RowDefinition Height="50*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
---"Foreach in ObservableCollection<NodViewModel>"---
<v:NodView DataContext="{Binding NodModel}"
Grid.Column="{Binding Position.Column}"
Grid.Row="{Binding Position.Row}" />
---"endforeach"---
</Grid>
您可以使用 Itemscontrol 并将 ObservableCollection 绑定到该 itemscontrol 的 itemsource
这解决了
<ItemsControl ItemsSource="{Binding NodKlassRepository}"
ItemTemplate="{StaticResource NodTemplate}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="20*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="10*"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row" Value="{Binding NodKlassModel.Row}"></Setter>
<Setter Property="Grid.Column" Value="{Binding NodKlassModel.Column}"></Setter>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
在 NodTemplate 中:
<DataTemplate x:Key="NodTemplate" DataType="{x:Type vm:NodKlassViewModel}">
<v:NodKlassView DataContext="{Binding}"/>
</DataTemplate>