WPF просто Grid Binding [закрыт]

199
07 июля 2022, 10:30
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 1 год назад.

Улучшить вопрос

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

<Grid x:Name="Screen" Grid.Row="1" Grid.ColumnSpan="4" Margin="20"></Grid>
List<int> mass = new List<int>();
List<Label> numbs = new List<Label>();
private void GenerateNumb(object sender, RoutedEventArgs e)
        {
            Random rnd = new Random();
            Screen.Children.Clear();
            mass = new List<int>();
            if (numberstring.Text.Length==0)
            {
                return;
            }
            int c = Convert.ToInt32(numberstring.Text);
           
            for (int i=0;i<c; i++)
            {
                mass.Add(rnd.Next());
                ColumnDefinition c1 = new ColumnDefinition();
                Screen.ColumnDefinitions.Add(c1);
                numbs.Add(new Label());
                Screen.Children.Add(numbs[i]);
                Grid.SetColumn(numbs[i], i);
                numbs[i].Content = mass[i];
            }
        }

Немного другой код

<ItemsControl ItemsSource="{Binding Buttons}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="3" Rows="3"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
class MainWindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop ="") 
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }

        public List<ButtonViewModel> _Buttons { get;  set; } = new List<ButtonViewModel>();
        public List<ButtonViewModel> Buttons
        {
            get
            {
                return _Buttons;
            }
            set
            {
                _Buttons = value;
                OnPropertyChanged();
            }
        }

        public class ButtonViewModel
        {
            public string Text
            {
                get;
                set;
            }
            public ICommand Command { get; set; }
            public ButtonViewModel(string text)
            {
                Text = text;
            }
        }




        public MainWindowViewModel()
        {
            Buttons.Add(new ButtonViewModel("1"));
            Buttons.Add(new ButtonViewModel("2"));
            Buttons.Add(new ButtonViewModel("3"));
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    Task.Delay(1000).Wait();
                    var Mytmp= Buttons[1];
                    Buttons[1] = Buttons[0];
                    Buttons[0] = Mytmp;
                }
            });
        }
    }
Answer 1

Как-то так это делается.

Верстку каждого элемента коллекции через ItemTemplate, а контрол, который будет служить контейнером - через ItemsPanelTemplate задается, можно использовать любую разновидность панели. То что вы ищете - это возможно UniformGrid (ссылка).

<ItemsControl ItemsSource="{Binding MyCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <local:MyControl Text="{Binding ...}" .../>
            <Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemControl>
READ ALSO
Внедрение информации о типах в .NET из C++/CLI

Внедрение информации о типах в .NET из C++/CLI

У меня есть native c++ dll, есть с++/cli враппер для нее (назовем эту длл-ку adaptordll)

253
Считать кириллицу из .xlsm в C#

Считать кириллицу из .xlsm в C#

Изначально моя программа принимала на вход CSV файл сохранённый в Unicode и нормально считывала с него данные, но пришлось перейти на Excel и вот...

280
Как изменить размер изображения перезаписав файл

Как изменить размер изображения перезаписав файл

Есть метод для изменения размера картинкиКак сделать чтобы он перезаписывал файл

313
Как обойти заданную директорию?

Как обойти заданную директорию?

Изначально в программе задана директория:

296