0

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

<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&lt;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&lt;ButtonViewModel&gt; _Buttons { get;  set; } = new List&lt;ButtonViewModel&gt;();
    public List&lt;ButtonViewModel&gt; 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(&quot;1&quot;));
        Buttons.Add(new ButtonViewModel(&quot;2&quot;));
        Buttons.Add(new ButtonViewModel(&quot;3&quot;));
        Task.Factory.StartNew(() =&gt;
        {
            while (true)
            {
                Task.Delay(1000).Wait();
                var Mytmp= Buttons[1];
                Buttons[1] = Buttons[0];
                Buttons[0] = Mytmp;
            }
        });
    }
}

1 Answers1

0

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

Верстку каждого элемента коллекции через 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>
aepot
  • 49,560
  • Зачем тут Grid на каждый item? Ну а так, я прям вот вангую, что человек не знает что должно быть в MyCollection. Ну и, в таком виде, это дубликат. – EvgeniyZ Nov 24 '20 at 22:35
  • Очень плохо, что лень, ибо это нарушение установленных правил и мы обязаны перед тем, как писать ответы проверить, есть ли похожее на SO, а их вы сами знаете, уйма. Я понимаю, что SO, это помойка, но зачем гадить-то еще сильнее? – EvgeniyZ Nov 24 '20 at 22:58
  • Не, против самого ответа (его содержимого) я не имею ничего против, ответ как ответ, в нем нету чего-либо сверхъестественного или наоборот, так что тут не берите на свой счет. Вы знаете, что я за порядок на SO всеми руками, но увы, мы с вами прекрасно знаем, что на него плевать всем другим (включая модераторов) из-за чего тут много вопросов, которые уже были заданы или которым тут попросту не место. По этой причине я и говорю вам, что это дубликат и хотелось бы, чтоб вы вместо ответов на подобное, искали бы дубли и голосовали за закрытие, но увы, вам "лень" и "всё равно" как и всем другим. – EvgeniyZ Nov 24 '20 at 23:11
  • @aepot Я всё ещё плохо понимаю, не подскажешь как правильно стоит преобразовать это под wpf? – HamsterVas Nov 25 '20 at 06:27
  • ТСу можно же предложить Attached Property? Разве нет? –  Nov 25 '20 at 06:34
  • @HamsterVas это и есть WPF. Назначьте DataContext, сделайте ваш массив доступным публично через свойство. Это и есть привязка данных. Это всё легко гуглится, если совсем непонятно. Ключевой момент - вам не нужно динамически создавать контролы в коде, ItemsControl сделает это за вас, вам нужно только скормить ему данные. А юзерконтрол внутри просто привяжите к нужному свойству или к самому элементу коллекции. Примеров того, о чем я сейчас пишу - полинтернета. – aepot Nov 25 '20 at 06:47
  • Что и требовалось в итоге ожидать, привет бессмысленный дубликат, который бесполезен для SO и даже бесполезен и непонятен для автора вопроса. Сам же вопрос вряд ли закроется, ибо тут люди не умеют голосовать за закрытие. Будет в итоге висеть как куча других. – EvgeniyZ Nov 25 '20 at 09:30
  • @EvgeniyZ как и куча бессмысленных коментариев под этим постом. Я свои почистил кстати. – aepot Nov 25 '20 at 09:31
  • Ну это ваше право, а я свои, пожалуй, оставлю. – EvgeniyZ Nov 25 '20 at 09:37
  • @HamsterVas Я хочу, чтоб на этом сайте соблюдались простейшие правила, а первый их пункт о чем гласит? Правильно, "ищите перед тем, как задать вопрос", я дал вон самым первым комментарием ссылку на дубликат, могу еще найти уйму таких. Также, изначально ваш вопрос был непонятным текстом, под которым можно было многое понять, из-за чего его и закрыли. К вам у меня претензий нет, новичок и все дела, но вот к автору этого вопроса, который здесь уже почти год, они есть, ибо "лень". Сейчас вопрос закрыт, он сам удалиться через некое время. – EvgeniyZ Nov 25 '20 at 22:48
  • @EvgeniyZ болезненный перфекционизм. Он меня лишил работы даже один раз. Теперь я выбираю, где надо, а где нет. Мир под себя не переделаешь. Если вам так хочется изменить SO к лучшему, что же вы не пошли в модераторы? Я бы даже за вас голос отдал. Видимо потому что это тяжелая работа, требующая кучи времени и терпения. И даже там пошатнуть манеру создания контента у сообщества вам было бы тяжело. А здесь, сидя в комментах у меня в ответе вы тем более ничего не решите. Переубеждение возможно только тогда, когда есть спорный момент. Здесь его нет. Остальное всё только слова. С уважением. – aepot Nov 25 '20 at 22:58
  • @aepot Да как вы не поймете то, я не хочу чего-либо менять, даже больше скажу, я многое допускают тут того, что нельзя по правилам, но я хочу порядка и чтоб люди следовали хоть немного поставленным правилам, не уж то это так трудно? Я пойму новичков, который только зашли сюда и считают это простым форумом, но вот вы, например, к чему был этот ответ, ради + в репутацию или благие намерения? Вы ведь прекрасно знаете, что вопросы удаляет система на которых нету ответов и которые с низкой оценкой, но нет, даем ответ, его лайкают и тем самым вопрос висит вечно в базе SO и все ради чего? – EvgeniyZ Nov 25 '20 at 23:06
  • @aepot А модераторы, я думаю вы тоже прекрасно знаете, что они тут бесполезны, ибо связаны многим и многого не могут, вспомнить, например случай про человека, который каждый день создавал новый акк и задавал с него вопрос, сделали что? Нет, до сих пор тот человек может также это продолжать. А по поводу комментариев, нету смысла писать посты на той же мете или еще где, призывать публику и так далее, вон, до сих пор решают нужны конкурсы на SO или нет, уже какой год, но вот напомнить человеку, который делает что-то неверно, сразу, по горячим следам, иногда очень даже помогает. – EvgeniyZ Nov 25 '20 at 23:11
  • @EvgeniyZ открою вам секрет, меня в целом всё что здесь происходит - полностью устраивает. Я испрользую SO в своих личных эгоистичных целях - набиваю здесь экспу в кодинге, и за год я уже благодаря в том числе вам вырос из адского джуна в возможно неплохого мидла, и дальше буду расти. А репа, контент и ваше мнение об этом - всего-лишь побочные эффекты, которые не делают ни хуже, не лучше. Не измеряйте мир по своим ценностям, мы с вами здесь наверняка по совершенно разным причинам, либо отдавайте при себе отчет, что это ваши субъективные ценности, и они могут быть расхожими например с моими. – aepot Nov 25 '20 at 23:26
  • 1
    @HamsterVas, если у вас возник новый вопрос - задайте его отдельно. – insolor Nov 26 '20 at 12:04
  • @aepot Ну вот что и требовалось доказать, вы, к сожалению, как и многие здесь, готовы ради репутации нарушить даже принятые тут правила и порядки. И тут мы с вами друг друга вряд ли когда поймем, ибо я, ради "заработка" не переступлю через черту закона и порядка, а вы, судя по вашим ответам, наоборот. Повторюсь, я не меняю тут чего либо, а наоборот, следую тому, что тут принято. С чего вы вообще взяли, что я хочу изменить SO? К чему эти "не изменяйте мир по своим ценностям"? Вот вы в магазине крадете кусок хлеба, я вижу это и говорю вам, "ну парень, ну не делай так", это я меняю мир? – EvgeniyZ Nov 26 '20 at 12:57
  • @aepot А по поводу которые не делают ни хуже, не лучше - ну, этот вопрос как минимум закрылся, думаете без этого разговора вы бы поставили свой голос? Я уверен, что нет, а другие бы прошли мимо, ибо есть ответ. Повлияло это на что-то, я считаю, что да, как и в многих других случаях. Буду я дальше это делать? Да, иногда "ткнуть носом" человека в его проступок бывает очень эффективно. А на этой ноте, я дальнейшего поводя для разговора не вижу, ибо я вас понял, как думаю и вы меня, чего уж дальше мусолить одно и тоже? Удачи. – EvgeniyZ Nov 26 '20 at 13:00
  • @HamsterVas оформите как новый вопрос. – aepot Nov 26 '20 at 14:10