Twoway Binding не работает в DataGrid.Resources - PullRequest
0 голосов
/ 19 января 2012

Мне не удается заставить TwoWay Binding работать правильно с использованием DataGrid.Resources.TextBox появляется со строкой на редактировании.Когда я выхожу из строки, объект, связанный с этой строкой, не обновляется новым значением (проверено с точками останова на объекте, который реализует INotifyPropertyChanged).

При построении нескольких шаблонов данных вне DataGrid.Resources работала привязка данных.

<DataGrid AutoGenerateColumns="False" Name="dataGridProviderProperties" Height="215" FontSize="11" HorizontalGridLinesBrush="#FFC1C1C1" 
                          VerticalGridLinesBrush="#FFC1C1C1" Padding="0" Background="#00000000" EnableRowVirtualization="False"
                          HorizontalScrollBarVisibility="Auto" EnableColumnVirtualization="True" CanUserResizeRows="False" AlternationCount="2" 
                          AlternatingRowBackground="#05000000" CanUserAddRows="False" DataContext="{Binding}" ItemsSource="{Binding Properties}" VerticalAlignment="Center" Width="345" 
                          VerticalContentAlignment="Center">
                    <DataGrid.Resources>
                        <DataTemplate x:Key="IsSelectedColumnTemplate">
                            <TextBlock Text="{Binding Value}"/>
                        </DataTemplate>
                        <DataTemplate x:Key="IsSelectedColumnTemplateEditing">
                            <ContentControl x:Name="ControlHolder" Content="{Binding Value}">
                                <ContentControl.Resources>
                                    <DataTemplate DataType="{x:Type System:String}">
                                        <TextBox Text="{Binding ., Mode=TwoWay}" />
                                    </DataTemplate>
                                    <DataTemplate DataType="{x:Type System:Boolean}">
                                        <CheckBox IsChecked="{Binding}"/>
                                    </DataTemplate>
                                </ContentControl.Resources>
                            </ContentControl>
                        </DataTemplate>
                    </DataGrid.Resources>
                    <DataGrid.Columns>
                        <DataGridTemplateColumn Header="Key" Width="100">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Label VerticalContentAlignment="Center"  Height="27" VerticalAlignment="Center" Content="{Binding Key, Mode=OneWay}" Padding="3"></Label>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTemplateColumn Header="Value" x:Name="myIsSelectedColumn" CellTemplate="{StaticResource IsSelectedColumnTemplate}"
                            CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}" CanUserSort="True" Width="Auto" />
                    </DataGrid.Columns>
                </DataGrid>

Ответы [ 2 ]

0 голосов
/ 19 января 2012

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

Мне пришлось создать класс DataTemplateSelector, а затем вызвать указанный класс в XAML.Ниже приведена копия нового кода XAML вместе с классом выбора шаблонов.

<Window.Resources>
        <DataTemplate x:Key="ProviderStringTemplate" DataType="{x:Type System:String}">
            <TextBox VerticalAlignment="Center" Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Width="200" />
        </DataTemplate>
        <DataTemplate x:Key="ProviderBooleanTemplate" DataType="{x:Type System:Boolean}">
            <CheckBox Margin="15,0,0,0" VerticalAlignment="Center" IsChecked="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
        </DataTemplate>
        <Windows:ProviderPropertyTemplateSelector x:Key="templateSelector" />
    </Window.Resources>    
<DataGrid AutoGenerateColumns="False" Name="dataGridProviderProperties" Height="215" FontSize="11" HorizontalGridLinesBrush="#FFC1C1C1" 
                            VerticalGridLinesBrush="#FFC1C1C1" Padding="0" Background="#00000000" HorizontalScrollBarVisibility="Auto" 
                              CanUserResizeRows="False" AlternationCount="2" AlternatingRowBackground="#05000000" CanUserAddRows="False" 
                              DataContext="{Binding}" ItemsSource="{Binding Properties}" VerticalAlignment="Center" Width="345" 
                            VerticalContentAlignment="Center" IsManipulationEnabled="False" CanUserReorderColumns="False" SelectionUnit="Cell">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Header="Key" Width="100">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Label VerticalContentAlignment="Center" Height="27" VerticalAlignment="Center" Content="{Binding Key}" Padding="3"></Label>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTemplateColumn Header="Value" CellTemplateSelector="{StaticResource templateSelector}" CanUserSort="True" Width="200" />
                        </DataGrid.Columns>
                    </DataGrid>

    public class ProviderPropertyTemplateSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var property = item as Property<object>;

            if (property == null)
                return null;

            if (property.Value is Boolean)
                return ((FrameworkElement)container).FindResource("ProviderBooleanTemplate") as DataTemplate;

            if (property.Value is String || property.Value is int)
                return ((FrameworkElement)container).FindResource("ProviderStringTemplate") as DataTemplate;

            return null;
        }
    }
0 голосов
/ 19 января 2012

У меня была похожая проблема. Взгляните на следующую страницу:

Ошибка привязки данных Silverlight

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...