Düğme denetimlerini verilere bağlama (WPF)

0

Soru

Bir Mainwindow'da (Button1'den Button20'ye) 20 grafik düğmesi denetimi gösteren bir uygulama üzerinde çalışıyorum. Her düğme denetimi bir içerik dizesi görüntüleyebilir ve aşağıdaki gibi tasarlanmış bir araç ipucuna sahiptir :

<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>

Bir XML dosyasındaki her düğme için dize içeriğini ve araç ipucu dizesini tanımlamak istiyorum, böylece bu bilgiler XML dosyasını değiştirerek değiştirilebilir.

Bunun için Bouton (fransızca) adlı bir nesneyi tanımlayan bir ViewModel oluşturdum. :

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 dosyasını okurken, boutonNumber, Content ve Tooltip hakkında bilgi içeren Bouton türünde 20 nesne oluşturuyorum. Daha sonra tüm bu Bouton nesneleri bir Liste koleksiyonunda saklanır.

Şimdi, her düğmedeki içerik dizesini ve araç ipucu dizesini görüntüleyebilmek için Bouton listem ile mainwindow'umdaki grafik denetimleri arasında veri bağlamayı kullanmak istiyorum. Ana pencerede aşağıdaki kodu kullandım :

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

burada lst bir liste koleksiyonu doğru başlatıldı.

Ancak veri bağlamanın Düğme denetimleri üzerinde nasıl çalışacağını bilmiyorum. 20 Düğme kontrolünün her birinin ilgili Bouton nesnesine (Boutons koleksiyonunda bulunan) doğru şekilde bağlanmasını nasıl sağlayabilirim ? Demek istediğim, Button1 denetimi dizelerini Bouton1 nesnemden, Button2 denetimi dizesini Bouton2 nesnesinden vb. Button20 denetimi ve Bouton20 nesnesine kadar nasıl alabilir ?

Yardımınız için teşekkür ederim. Lütfen wpf'ye yeni başladığımı ve bunun Visual Studio ile ilk WPF projem olduğunu unutmayın.

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

En iyi cevabı

0

En basit seçeneğin düğmenizi bir usercontrol'e sarmak olacağını düşünüyorum.

Bu UserControl sonra türünde bir özellik içerir Bouton (not great adlandırma btw. - farklı bir dil olsa bile, "düğme" terimi zaten var, bu yüzden bu oldukça belirsiz. Anadili ingilizce olmayan bir konuşmacı olarak, ingilizce olarak adlandırmaya alışmanızı da tavsiye ederim, uzun vadede sizi çok fazla baş ağrısından kurtaracaktır, ancak bu öznel olabilir )

Daha sonra doğrudan Usercontrol'ün şablonundaki bu özelliğe bağlayabilirsiniz. Tek yapmanız gereken, her Usercontrol'e doğru düğme verilerini atamaktır.

örn.

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

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

ve UserControl şablonunuzda:

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

Daha sonra Usercontrol'ü xaml'nize şu şekilde yerleştirebilirsiniz:

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

<ctrls:CustomButton name="myFirstButton"/>

Şimdi tek yapmanız gereken, her custombutton'ın ParsedButtonData karşılık gelen veri parçasına ayarlandığından emin olmaktır. Bunu, XAML'NİZDE oluşturulan her düğme için manuel olarak ayarlayabilir veya ilk etapta C# aracılığıyla CustomButtons oluşturabilirsiniz.

Usercontrol'lerinizi xaml'de oluşturursanız, örneğin:

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

Alternatif olarak, genişletmeye bakmak isteyebilirsiniz ItemsControl. Temel olarak bu tür bir uygulama için yapılmıştır. Bir ItemsControl, aşağıdaki gibi herhangi bir koleksiyon türü olabilen bir ıtemssource'a sahiptir List<> veya ObservableCollection<>. Daha sonra alt öğelerini bu koleksiyondan oluşturur ve datacontext'i söz konusu listedeki ilgili öğeye otomatik olarak ayarlar.

Bunun örnekleri şöyle olurdu DataGrid veya ListView. Bu işin içinde olsa daha az olması, Eğer gerçekten sadece tek bir Görünüm Düğmeleri bir demet yapmak istiyorsanız buluyorum.

2021-11-22 17:47:49

Soruma, cevabınıza ve verdiğiniz kodun ayrıntılarına gösterdiğiniz ilgiyi gerçekten takdir ediyorum. En kısa sürede bunu bir deneyin vereceğim. Teşekkürler yardım için bir sürü !
Bruno Barral

Bu kodu dün denedim. Hala bazı sorularım var: CustomButton sınıfını Düğmeden devraldım (önerdiğiniz gibi Usercontrol'den değil), ancak CustomButton sınıfında bulunmadığı söylenen Click olayı hakkında bir hata mesajım var. Temel sınıfın (Düğme) Click olayı uygulandığından beri şaşırdım. Üssü aramaya çalıştım.Custombutton'dan () öğesini tıklatın, ancak yine de bir hata iletisi alıyorum. Click olayının neden Button sınıfında olduğu gibi custombutton'da bulunmadığını anlamıyorum.
Bruno Barral

Neden Düğmeden devralmak yerine bir UserControl kullanmıyorsunuz? Bir Usercontrol'de, şablona yerleştirdiğiniz herhangi bir düğme için bir tıklama olayını kolayca kaydedersiniz.
Shrimperator

Tamam çalışacağım bu. Teşekkür ederim.
Bruno Barral

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................