DataGridTemplateColumn中的WPF数据绑定ComboBox

时间:2011-06-01 15:18:53

标签: wpf data-binding binding

我有一个DataGrid,我想根据行填充包含ComboBox的列,该列包含动态的ItemsSource元素。我正确地显示了组合框,并在列表中填充了正确的元素列表,从AvailableLogFileProcessTypes属性(即ReadOnlyCollection)中提取。但是,当用户在组合框中进行选择时,LogFileProcessType属性未设置为选择。

数据:

Property LogFileDirectories, IEnumerable<LogFileData>,
LogFileData:
public LogFileProcessType LogFileProcessType{get;set;}
public ReadOnlyCollection<LogFileProcessType> AvailableLogFileProcessTypes { get; set; }

该属性当前有一个支持字段,并且set属性中的断点不会被命中,因此我知道它已本地化为绑定设置。我的XAML有什么问题阻止设置属性?

如您所见,我已尝试在CellEditingTemplate和CellTemplate中设置SelectedValue和SelectedItem。我不确定哪一个是合适的。

 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=LogFileDirectories, UpdateSourceTrigger=PropertyChanged}"
      HeadersVisibility="Column" CanUserReorderColumns="False" CanUserAddRows="False" Margin="0,0,0,35" Grid.RowSpan="3">
<DataGrid.Columns>
    <DataGridCheckBoxColumn Header="Processed" Binding="{Binding Path=IsProcessingComplete, Mode=OneWay}" Width="70" IsReadOnly="True" />
    <DataGridTemplateColumn Header="template">
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay}"
                          SelectedItem="{Binding Path=LogFileProcessType, Mode=TwoWay}"
                          ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>      
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay}"
                          SelectedItem="{Binding Path=LogFileProcessType, Mode=TwoWay}"
                          ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>                            
    </DataGridTemplateColumn>                        
</DataGrid.Columns>                    
</DataGrid>

2 个答案:

答案 0 :(得分:6)

参见大马士革对思维过程的反应。

需要在CellTemplate / CelLEditTemplate上指定UpdateSourceTrigger。这会触发属性更改。

 <DataGridTemplateColumn Header="template">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>      
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox SelectedValue="{Binding Path=LogFileProcessType, UpdateSourceTrigger=PropertyChanged}"
                      ItemsSource="{Binding Path=AvailableLogFileProcessTypes}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>                            
</DataGridTemplateColumn>  

答案 1 :(得分:4)

尝试将此添加到您的ComboBox

<ComboBox SelectedValue="{Binding Path=LogFileProcessType, Mode=TwoWay}"
                          SelectedItem="{Binding Path=LogFileProcessType, Mode=TwoWay}"
                          ItemsSource="{Binding Path=AvailableLogFileProcessTypes, UpdateSourceTrigger=PropertyChanged}"/>

因此,如果UpdateSourceTrigger设置为PropertyChanged,则每次对象AvailableLogFileProcessTypes更改并调用OnPropertyChanged时,ItemsSource都会刷新。< / p>