ItemsControl을 사용하여 그리드에서 항목을 동적으로 생성하려고합니다. 나는 그리드가 한 행과 2 * (엘리먼트 수) 열을 가지기를 원하기 때문에 엘리먼트 사이의 간격은 같을 수있다. 항목은 컨테이너에서 사용 가능한 모든 가로 공간을 가져와야하며 둘 사이의 두꺼운 선이어야합니다.MVVM UWP를 통해 그리드의 요소를 동적으로 생성합니다.
private void Page_Loaded(object sender, RoutedEventArgs e)
{
((MainViewModel)this.DataContext).Container = this.FindName("algContainer") as Grid;
}
각 항목에 대한 뷰 모델은 다음과 같습니다 : 나는 페이지의 코드 숨김의 항목을 보유해야 컨테이너를 결합
요소를 생성방법은 페이지에
public class ElementViewModel : BaseViewModel
{
private int _column;
private double _width;
private double _height;
private double _strokeTickness;
private Brush _fill;
private SolidColorBrush _stroke;
private VerticalAlignment _verticalAlignment;
public ElementViewModel()
{
}
public double Width
{
get { return _width; }
set
{
_width = value;
NotifyPropertyChanged();
}
}
public double Height
{
get { return _height; }
set
{
_height = value;
NotifyPropertyChanged();
}
}
public Brush Fill
{
get { return _fill; }
set
{
_fill = value;
NotifyPropertyChanged();
}
}
public VerticalAlignment VerticalAlignment
{
get { return _verticalAlignment; }
set
{
_verticalAlignment = value;
NotifyPropertyChanged();
}
}
public double StrokeThickness
{
get { return _strokeTickness; }
set
{
_strokeTickness = value;
NotifyPropertyChanged();
}
}
public SolidColorBrush Stroke
{
get { return _stroke; }
set
{
_stroke = value;
NotifyPropertyChanged();
}
}
public int Column
{
get { return _column; }
set
{
_column = value;
NotifyPropertyChanged();
}
}
}
보기 모델 :
public ICommand Sort
{
get
{
if (this._sortCommand == null)
{
this._sortCommand = new RelayCommand(this.PerformSort);
}
return this._sortCommand;
}
}
private void PerformSort()
{
this.ElementCollection = PopulateElements();
}
private List<ElementViewModel> PopulateElements()
{
var heightsList = GenerateRadnomNumbers(this.ElementsCount, (int)this.Container.ActualHeight);
double width = this.Container.ActualWidth/this.ElementsCount;
var collection = new List<ElementViewModel>();
this.Container.ColumnDefinitions.Clear();
this.Container.Children.Clear();
for (int i = 0, j = 1; i < this.ElementsCount; i++, j += 2)
{
var emptyColDef = new ColumnDefinition();
var elementColDef = new ColumnDefinition();
var element = new ElementViewModel();
emptyColDef.Width = GridLength.Auto;
elementColDef.Width = new GridLength(1, GridUnitType.Star);
this.Container.ColumnDefinitions.Add(emptyColDef);
this.Container.ColumnDefinitions.Add(elementColDef);
element.Width = width;
element.Height = heightsList[i];
element.Column = j;
element.Fill = new SolidColorBrush(Colors.Black);
element.Stroke = new SolidColorBrush(Colors.White);
element.StrokeThickness = 1;
element.VerticalAlignment = VerticalAlignment.Bottom;
collection.Add(element);
}
return collection;
}
내가 채울하려는 XAML은 다음과 같습니다
<Grid Grid.Row="1" Grid.ColumnSpan="2" Margin="12">
<ItemsControl ItemsSource="{Binding ElementCollection, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid x:Name="algContainer" Background="White"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Fill}" StrokeThickness="{Binding StrokeThickness}" Stroke="{Binding Stroke}" Grid.Column="{Binding Column}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
<Border Margin="12" Grid.Row="4" Grid.Column="0">
<Button x:Name="sortButton" Content="Sort" VerticalAlignment="Center" HorizontalAlignment="Center" Width="80" Command="{Binding Sort}"/>
</Border>
모든 것은 작동하지만 요소 (직사각형)는 많은 행이있는 하나의 열에 배치되지만 여러 열이있는 하나의 행에 있어야합니다. ItemsControl의 문제이며 어떻게 변경해야합니까?
'((MainViewModel) this.DataContext) .Container = this.FindName ("algContainer")을 Grid로; 이것은 MVVM이 아닙니다. DataTemplates를 사용해야합니다. 그들이 무엇인지 어떻게 사용되었는지 모를 경우 지금 연구하십시오. 데이터 템플릿만으로는 너무 복잡하기 때문에 사용자 정의 컨트롤을 만들고 그 안에 UI 작업을 캡슐화하십시오. 공용 종속성 속성을 공개하고 해당 속성을보기 모델에 바인딩합니다 (또는보기 모델에 격자에 넣어야하는 항목이 들어있는 속성). – Will