![](/img/trans.png)
[英]TwoWay Binding ObservableCollection to DataGrid in WPF not working
[英]Twoway Binding not working within DataGrid.Resources
我無法使用DataGrid.Resources使TwoWay綁定正常工作。 出現文本框,並在編輯時顯示該行。 當我退出該行時,綁定到該行的對象不會使用新值更新(已在實現INotifyPropertyChanged的對象上使用斷點進行了測試)。
在 DataGrid.Resources 之外構建多個Datatemplates之前,數據綁定工作正常。
<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>
我有這個類似的問題。 看一下以下頁面:
我正在用問題的解決方案來更新我的問題。 希望這對遇到同樣問題的人有所幫助。
我必須創建一個DataTemplateSelector類,然后在XAML中調用所說的類。 下面是新的XAML代碼以及Template Selector類的副本。
<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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.