Связывание элементов управления кнопками с данными (WPF)

0

Вопрос

Я работаю над приложением, в котором отображаются 20 графических элементов управления кнопками в главном окне (от кнопки 1 до кнопки 20). Каждый элемент управления кнопкой может отображать строку содержимого и имеет всплывающую подсказку, выполненную следующим образом :

<Button x:Name="button1" FontWeight="Bold" FontSize="15" Content="" HorizontalAlignment="Left" Margin="20,69,0,0" VerticalAlignment="Top" Width="92" Height="29" Click="Button_Click" Background="#FFFFFFFF" MouseEnter="button_MouseEnter">
        <Button.ToolTip>
            <Border Margin="-4,0,-4,-3" Padding="10" Background="Yellow">
                <Border.BitmapEffect>
                    <OuterGlowBitmapEffect></OuterGlowBitmapEffect>
                </Border.BitmapEffect>
                <Label x:Name ="lbl1" FontSize="20" Content="{Binding Path=ToolTip}">
                </Label>
            </Border>
        </Button.ToolTip>
        <Button.Effect>
            <DropShadowEffect/>
        </Button.Effect>
    </Button>

Я хотел бы определить содержимое строки и строку подсказки для каждой кнопки в XML-файле, чтобы эту информацию можно было изменить, изменив XML-файл.

Для этого я создал модель представления, определяющую объект под названием Бутон (по-французски). :

public class Bouton : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void Notify(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    int boutonNumber;
    public int BoutonNumber{ get { return boutonNumber; } set { boutonNumber= value; Notify("BoutonNumber"); } }
    string texteBouton;
    public string TexteBouton { get { return texteBouton; } set { texteBouton = value; Notify("TexteBouton"); } }
    string tooltip;
    public string Tooltip { get { return tooltip; } set { tooltip = value; Notify("ToolTip"); } }
    public Bouton(int nb, string tb, string tt)
    {
        BoutonNumber = nb;
        TexteBouton = tb;
        Tooltip = tt;
    }
}

При чтении XML - файла я создаю 20 объектов типа Бутон с информацией о номере Бутона, Содержимом и подсказкой. Затем все эти объекты Бутона сохраняются в коллекции списков.

Теперь я хочу использовать привязку данных между моим списком Бутона и графическими элементами управления в моем главном окне, чтобы иметь возможность отображать строку содержимого и строку подсказок на каждой кнопке. В главном окне я использовал следующий код :

public MainWindow()
    {
        InitializeComponent();
        List<Bouton> lst = Utilities.CreateList();
        this.DataContext = lst;
    }

где lst-это правильно инициализированная коллекция списков.

Но я не знаю, как заставить привязку данных работать с элементами управления кнопками. Как я могу правильно связать каждый из 20 элементов управления кнопками с соответствующим объектом Бутона (содержащимся в коллекции Бутонов) ? Я имею в виду, как элемент управления Button1 может получить свои строки из моего объекта Bouton1, элемент управления Button2 может получить свою строку из объекта Bouton2 и так далее, пока элемент управления Button20 и объект Bouton20 не появятся ?

Спасибо вам за вашу помощь. Пожалуйста, обратите внимание, что я новичок в WPF, и это мой первый проект WPF с Visual Studio.

c# controls windows wpf
2021-11-22 16:00:24
1

Лучший ответ

0

Я думаю, что самым простым вариантом было бы завернуть вашу кнопку в пользовательский элемент управления.

Затем этот пользовательский элемент управления содержит свойство типа Bouton (кстати, не очень удачное название. - даже если это другой язык, термин "кнопка" уже существует, так что это довольно двусмысленно. Как сам не носитель английского языка, я также рекомендую привыкнуть называть имена на английском языке, это избавит вас от многих головных болей в долгосрочной перспективе, но это может быть субъективно )

Затем вы можете напрямую привязаться к этому свойству в шаблоне UserControl. Все, что вам нужно сделать, это назначить каждому пользователю правильные данные кнопки.

напр..

public class CustomButton : UserControl
{
    public Bouton ParsedButtonData { get; set; }

    public CustomButton()
    {
        DataContext = this;
        InitializeComponent();
    }
}

и в шаблоне вашего пользовательского элемента управления:

<Button ...>
    <Button.ToolTip>
        <Border ...>
            <Label Content="{Binding ParsedButtonData.Tooltip}" ...>
            </Label>
        </Border>
    </Button.ToolTip>
</Button>

Затем вы можете поместить пользовательский элемент управления в свой XAML следующим образом:

xmlns:ctrls="clr-namespace:MyProject.MyNamespace"

<ctrls:CustomButton name="myFirstButton"/>

Теперь все, что вам нужно сделать, это убедиться, что у каждой пользовательской кнопки есть свои данные ParsedButtonData, настроенные на соответствующий фрагмент данных. Вы можете либо установить это вручную для каждой кнопки, созданной в вашем XAML, либо в первую очередь создать пользовательские кнопки с помощью C#.

Если вы создадите свои пользовательские элементы управления в XAML, например:

public void SomeMethod()
{
    myFirstButton.ParsedButtonData = lst[0];
}

В качестве альтернативы вы можете рассмотреть возможность расширения ItemsControl. Он в основном создан для такого рода приложений. Элемент управления ItemsControl имеет источник элементов, который может быть любого типа коллекции, например List<> или ObservableCollection<>. Затем он создает свои дочерние элементы из этой коллекции, автоматически устанавливая DataContext на соответствующий элемент в указанном списке.

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

2021-11-22 17:47:49

Я действительно ценю ваш интерес к моему вопросу, вашему ответу и деталям кода, который вы в нем указали. Я постараюсь сделать это как можно скорее. Большое спасибо за вашу помощь !
Bruno Barral

Я попробовал этот код вчера. У меня все еще есть некоторые вопросы : я сделал класс CustomButton наследуемым от Button (а не от UserControl, как вы предлагали), но у меня есть сообщение об ошибке о событии щелчка, которое, как говорят, отсутствует в классе CustomButton. Я удивлен, так как в базовом классе (Кнопка) реализовано событие Click. Я пытался дозвониться до базы.Нажмите() в пользовательской кнопке, но я все равно получаю сообщение об ошибке. Я не понимаю, почему событие щелчка не существует в CustomButton, так как оно существует в классе кнопок.
Bruno Barral

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

Хорошо, я попробую это сделать. Спасибо.
Bruno Barral

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................