Динамически контролировать количество кнопок в WPF - PullRequest
1 голос
/ 12 января 2012

Я недавно работаю с WPF. Теперь я столкнулся с проблемой.

У меня есть кнопка «ДОБАВИТЬ», каждый раз при нажатии на нее добавляется новая строка с некоторым содержимым. Это содержимое показано ниже -

                    <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                    <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                    <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                    <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                    <Button Content="M1" Margin="10,10" Height="20"/>
                    <Button Content="M2" Margin="10,10" Height="20"/>
                    <Button Content="M3" Margin="10,10" Height="20"/>
                </WrapPanel>
            </Grid>

Здесь в конце находятся три кнопки M1, M2, M3. Но мне не нужны все эти три кнопки каждый раз. Мне может понадобиться только M1 или только M2 или только M3 или M1, M2 и т. Д.

Как я могу сделать это в C #? На самом деле я даже не знаю, я в правильном направлении?

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 12 января 2012

Я бы настоятельно рекомендовал изучить шаблон проектирования MVVM при работе с WPF

.

Тем не менее, я бы связал свой XAML с ObservableCollection<SomeObject>, а нажатие на AddButton добавило бы новый SomeObject к ObservableCollection. Это заставит пользовательский интерфейс автоматически добавлять новую строку при обновлении коллекции, и SomeObject может иметь свойства для IsM1Visible, IsM2Visible и IsM3Visible, которые определяют, какие кнопки видны.

Например,

Класс SomeObject будет иметь

string Name;
string City;
int Age;
int Count;
bool IsM1Visible;
bool IsM2Visible;
bool IsM3Visible;

XAML будет выглядеть примерно так:

<ItemsControl ItemsSource="{Binding SomeCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                <TextBox Text="{Binding Name}" Margin="10,10" Height="20"  ></TextBox>
                <TextBox Text="{Binding City}" Margin="10,10" Height="20" ></TextBox>
                <TextBox Text="{Binding Age}" Margin="10,10" Height="20"></TextBox>
                <TextBox Text="{Binding Count}" Margin="10,10" Height="20" ></TextBox>
                <Button Content="M1" Visibility="{Binding IsM1Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
                <Button Content="M2" Visibility="{Binding IsM2Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
                <Button Content="M3" Visibility="{Binding IsM3Visible, Converter="{StaticResource BooleanToVisibilityConverter}" Margin="10,10" Height="20"/>
            </WrapPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

И событие Click кнопки Add будет выглядеть примерно так:

void AddButton_Click(object sender, EventArgs e)
{
    var newItem = new SomeItem
        {
            Name = "Something",
            City = "Something",
            Age = 30,
            Count = 2,
            IsM1Visible = true,
            IsM2Visible = false,
            IsM3Visible = true
        };

    SomeCollection.Add(newItem);
}
1 голос
/ 12 января 2012

Вы можете использовать привязку данных, если количество кнопок зависит от размера списка / коллекции.

<ItemsControl ItemsSource={Binding Ms}>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}" Command={Binding ThingToDoWhenClickedCommand}/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl ItemsSource={Binding}>

В результате будет сгенерировано ровно столько кнопок в коллекции / списке Ms, что в DataContext.

0 голосов
/ 12 января 2012

Во-первых, давайте создадим модель представления для строки. В этой модели у вас будет 3 свойства bool: IsButton1Visible, IsButton2Visible, IsButton3Visible или что-то в этом роде, со всеми свойствами, которые необходимо связать в строке. Во-вторых, ваш сценарий заключается в том, что при нажатии кнопки «Добавить» будет добавлена ​​новая строка. Итак, у вас есть список Row_View_Model. На AddCommand вы будете в новой Row_View_Model в списке. Здесь у вас есть полный контроль над тем, какую кнопку вы хотите показать.

0 голосов
/ 12 января 2012

Вы используете MVVM?

Если так, то это легко. Просто создайте объект ButtonViewModel, который представляет одну из ваших кнопок, и предоставьте ObservableCollection их из вашей основной ViewModel.

По вашему мнению, у вас есть ListView или просто ItemsControl, привязанный к коллекции, и DataTemplate, превращающий вашу ButtonViewModel в кнопку.

Когда пользователь нажимает кнопку Добавить, добавьте новую ButtonViewModel в свою коллекцию, и представление обновится, чтобы соответствовать.

0 голосов
/ 12 января 2012

Вы можете просто добавить кнопки в файлы с выделенным кодом и поместить структуру if вокруг кнопок, чтобы определить, какую кнопку следует загрузить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...