none
DataGridComboBoxColumn zeigt nicht das ausgewählte Element

    Frage

  • Hallo,

    ich habe folgende XAML Definition

    <Window x:Class="DataGrid7T.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            x:Name="testdialog"
            Title="MainWindow" Height="220" Width="525">
        <StackPanel Orientation="Vertical">
            <DataGrid AutoGenerateColumns="False"  Height="120" Name="table" HorizontalAlignment="Stretch" ItemsSource="{Binding}" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Text" Binding="{Binding Text}" IsReadOnly="True"/>
                    <DataGridComboBoxColumn Header="Auswahl" TextBinding="{Binding AuswahlS, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  >
                        <DataGridComboBoxColumn.EditingElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding Path=AuswahlL, ElementName=testdialog}" />
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>
                </DataGrid.Columns>
            </DataGrid>
            <Label Content="Label" Height="28" Name="label1" />
            <TextBox Height="23" Name="textBox1" Width="120" HorizontalAlignment="Left" />
        </StackPanel>
    </Window>
    

    Mein code behind sieht wie folgt aus:

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                ObservableCollection<MyElement> oc = new ObservableCollection<MyElement>();
                oc.Add(new MyElement() { Text = "Zeile1", Auswahl = (int)MyElementAuswahl.W1 });
                oc.Add(new MyElement() { Text = "Zeile2", Auswahl = (int)MyElementAuswahl.W2 });
                oc.Add(new MyElement() { Text = "Zeile3", Auswahl = (int)MyElementAuswahl.W3 });
                table.ItemsSource = oc;
            }
    
            public string[] AuswahlL { get { return Enum.GetNames(typeof(MyElementAuswahl)); } }
        }
    

    Die MyElement Klasse verwendet das INotifyPropertyChanged interface wie folgt:

        public class MyElement : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                    handler(this, new PropertyChangedEventArgs(propertyName));
            }
    
            private string text;
            public string Text
            {
                get { return text; }
                set
                {
                    if (text != value)
                    {
                        text = value;
                        OnPropertyChanged("Text");
                    }
                }
            }
    
            private int auswahl;
            public int Auswahl
            {
                get { return auswahl; }
                set
                {
                    if (auswahl != value)
                    {
                        auswahl = value;
                        OnPropertyChanged("Auswahl");
                    }
                }
            }
    
            public string AuswahlS
            {
                get { return ((MyElementAuswahl)Enum.Parse(typeof(MyElementAuswahl), auswahl.ToString())).ToString(); }
                set
                {
                    Auswahl = (int)(MyElementAuswahl)Enum.Parse(typeof(MyElementAuswahl), value);
                    OnPropertyChanged("AuswahlS");
                }
            }
    
        }
    
        public enum MyElementAuswahl { W1, W2, W3 }

    Wenn das Window angezeigt wird, ist der ausgewählte Text in der DataGridComboBoxColumn nicht sichtbar. Nach einem double click in diese Spalte erscheint der richtige Text (aber nur in der angeclickten Zeile). Wenn ich eine neue Auswahl treffe und dann in die nächste Zeile wechsle, verschwindet der Text wieder. Wenn ich wieder in die geänderte Zeile zurückgehe und wieder einen double click in der DataGridComboBoxColumn mache, sehe ich den geänderten Text.

    Was muss ich tun damit die ausgewählten Werte immer sichtbar sind?

    Danke

    Walter


    Walter Taus

    Donnerstag, 27. Juni 2013 21:28

Antworten

  • Hallo, du musst noch den ElementStyle festlegen:
                            <DataGridComboBoxColumn.ElementStyle>
                                <Style TargetType="ComboBox">
                                    <Setter Property="ItemsSource" Value="{Binding Path=AuswahlL, ElementName=testdialog}" />
                                </Style>
                            </DataGridComboBoxColumn.ElementStyle>
    So wird auch etwas angezeigt, wenn sich die Zelle nicht im Editiermodus befindet.

    - Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    ; Webseite | Code Beispiele | Facebook | Snippets | Twitter
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    • Als Antwort markiert WalterTaus Freitag, 28. Juni 2013 07:57
    Donnerstag, 27. Juni 2013 22:24
    Moderator

Alle Antworten

  • Hallo, du musst noch den ElementStyle festlegen:
                            <DataGridComboBoxColumn.ElementStyle>
                                <Style TargetType="ComboBox">
                                    <Setter Property="ItemsSource" Value="{Binding Path=AuswahlL, ElementName=testdialog}" />
                                </Style>
                            </DataGridComboBoxColumn.ElementStyle>
    So wird auch etwas angezeigt, wenn sich die Zelle nicht im Editiermodus befindet.

    - Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    ; Webseite | Code Beispiele | Facebook | Snippets | Twitter
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    • Als Antwort markiert WalterTaus Freitag, 28. Juni 2013 07:57
    Donnerstag, 27. Juni 2013 22:24
    Moderator
  • Hallo Tom,

    funktioniert bestens.

    Danke

    Walter


    Walter Taus

    Freitag, 28. Juni 2013 07:58