шаблонный столбец wpf 4.0 datagrid двухсторонняя обязательная проблема

Я использую datagrid от wpf 4.0. Это имеет TemplateColumn, содержащий флажок. Свойство IsChecked флажка установлено через привязку.

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

Я должен упомянуть, что тот же код работает отлично в .net 3.5 с datagrid от wpf инструментария.

Смотрите на .xaml и .cs содержание.

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

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>

и связанное .cs содержание:

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
    }
}
15
задан rouwlee 28 May 2010 в 14:49
поделиться

2 ответа

Вы установили UpdateSourceTrigger=PropertyChanged в привязке Checkbox IsChecked в шаблоне данных:

34
ответ дан 1 December 2019 в 01:05
поделиться

Дело в том, как работает сетка данных, в том, что она создает представление данных и отображает его вместо исходных данных, поэтому, когда вы просто привязываете свойство в CellTemplate он не распространяется от представления к данным.

Что вам нужно сделать, так это использовать CellEditingTemplate , чтобы сетка данных знала, когда вы редактируете, и могла распространить его на данные, когда закончите (или она может отменить это, если вы отмените).

Вот вам измененный XAML:

<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"
/>
...
5
ответ дан 1 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: