15 Stimmen

wpf 4.0 datagrid Vorlage Spalte Zwei-Wege-Bindung Problem

Ich verwende das Datagrid aus WPF 4.0. Diese hat eine TemplateColumn, die ein Kontrollkästchen enthält. Die IsChecked-Eigenschaft des Kontrollkästchens wird über die Bindung festgelegt.

Das Problem ist, dass selbst wenn ich den Bindungsmodus explizit auf TwoWay einstelle, es nur in eine Richtung funktioniert.

Ich muss erwähnen, dass derselbe Code in .net 3.5 mit dem Datagrid aus dem wpf-Toolkit perfekt funktioniert.

Bitte sehen Sie sich den Inhalt von .xaml und .cs an.

Vielen Dank im Voraus,

Roland

<Window.Resources>
    <DataTemplate
        x:Key="IsSelectedColumnTemplate">
        <CheckBox
            IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"
            />
    </DataTemplate>
</Window.Resources>
<Grid>
    <DataGrid
        x:Name="dataGrid"
        AutoGenerateColumns="false"
        CanUserAddRows="False"
        CanUserDeleteRows="False"
        HeadersVisibility="Column"
        ItemsSource="{Binding}"
        >
        <DataGrid.Columns>
            <DataGridTemplateColumn 
                Header="Preselected"
                x:Name="myIsSelectedColumn" 
                CellTemplate="{StaticResource IsSelectedColumnTemplate}"
                CanUserSort="True"
                SortMemberPath="Orientation"
                Width="Auto"
                />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

und den zugehörigen .cs-Inhalt:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        ObservableCollection<DataObject> DataSource = new ObservableCollection<DataObject>();
        DataSource.Add(new DataObject());    
        DataSource.Add(new DataObject());          
        dataGrid.ItemsSource = DataSource;
    }
}

public class DataObject : DependencyObject
{
    public bool IsSelected
    {
        get { return (bool)GetValue(IsSelectedProperty); }
        set { SetValue(IsSelectedProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsSelected.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsSelectedProperty =
        DependencyProperty.Register("IsSelected", typeof(bool), typeof(DataObject), new UIPropertyMetadata(false, OnIsSelectedChanged));

    private static void OnIsSelectedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        // this part is not reached
    }
}

35voto

Stefan Szasz Punkte 1247

Sie setzen UpdateSourceTrigger=PropertyChanged in Ihrer Checkbox IsChecked-Bindung im Datatemplate: <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

5voto

Aviad P. Punkte 30713

Hier ist der Deal, die Art und Weise das Datengitter funktioniert, ist, dass es eine Datenansicht erstellt und zeigt es anstelle der ursprünglichen Daten, also wenn Sie einfach eine Eigenschaft in der CellTemplate es wird nicht von der Ansicht auf die Daten übertragen.

Dazu müssen Sie die Funktion CellEditingTemplate so dass die Datentabelle weiß, wann Sie die Daten bearbeiten, und kann es auf die Daten übertragen, wenn Sie fertig sind (oder es kann es rückgängig machen, wenn Sie abbrechen).

Hier ist die geänderte XAML für Sie:

<Window.Resources>
    <DataTemplate x:Key="IsSelectedColumnTemplate">
        <TextBlock Text="{Binding IsSelected}"/>
    </DataTemplate>
    <DataTemplate x:Key="IsSelectedColumnTemplateEditing">
        <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"/>
    </DataTemplate>
</Window.Resources>

...
<DataGridTemplateColumn 
    Header="Preselected"
    x:Name="myIsSelectedColumn" 
    CellTemplate="{StaticResource IsSelectedColumnTemplate}"
    CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
    CanUserSort="True"
    Width="Auto"
/>
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X