2016-09-18 215 views
0

我有DataGridComboBoxColumn应该显示整数或文本“默认”。当我添加行时,combobox从viewmodel的绑定属性中获取正确的值,但是当我更改用户界面中的值时,该属性的集合不会被调用。我尝试了SelectedValueBinding和SelectedItemBinding。转换器的ConvertBack永远不会被调用。我不应该知道它应该被称为。为什么更改DataGrid ComboBox值不会更新绑定属性?

的事物,它们:

  • 的DataGrid的SelectedItem结合
  • 文本列绑定两种方式(此处省略短促)

这里是我的代码:

XAML:

<DataGrid Name="SelectionSetsGrid" CanUserAddRows="False" CanUserResizeColumns="True" CanUserSortColumns="True" 
         ItemsSource="{Binding SelectionSets}" AutoGenerateColumns="False" 
         SelectedItem="{Binding SelectedSelectionSet}"> 
<DataGrid.Columns> 
    <DataGridComboBoxColumn Header="Width" SelectedValueBinding="{Binding LineWidthIndex}"> 
    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox" BasedOn="{StaticResource Theme.ComboBox.Style}"> 
      <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.LineWidths}"/> 
      <Setter Property="IsReadOnly" Value="True"/> 
      <Setter Property="ItemTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <WrapPanel> 
          <TextBlock Text="{Binding Converter={StaticResource IntToIntTextOrDefaultConverter}}" VerticalAlignment="Center"/> 
         </WrapPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
    <DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox" BasedOn="{StaticResource Theme.ComboBox.Style}"> 
      <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.LineWidths}"/> 
      <Setter Property="ItemTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <WrapPanel> 
          <TextBlock Text="{Binding Converter={StaticResource IntToIntTextOrDefaultConverter}}" VerticalAlignment="Center"/> 
         </WrapPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGridComboBoxColumn.EditingElementStyle> 
    </DataGridComboBoxColumn> 
</DataGrid.Columns> 
</DataGrid> 

视图模型(视图模型实现INotifyPropertyChanged和的SetValue引发的PropertyChanged):

public class SelectedObjectsViewModel : ViewModel 
{ 
    private int[] _lineWidths = { -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    public ObservableCollection<int> LineWidths { get; private set; }; 

    private ObservableCollection<SelectionSetViewModel> _selectionSets; 
    public ObservableCollection<SelectionSetViewModel> SelectionSets 
    { 
     get { return _selectionSets; } 
     set { this.SetValue(ref _selectionSets, value); } 
    } 

    private SelectionSetViewModel _selectedSelectionSet; 
    public SelectionSetViewModel SelectedSelectionSet 
    { 
     get { return this._selectedSelectionSet; } 
     set { this.SetValue(ref _selectedSelectionSet, value); } 
    } 
} 

视图模型为DataGrid行(视图模型实现INotifyPropertyChanged和的SetValue引发的PropertyChanged):

public class SelectionSetViewModel : ViewModel 
{ 
    public SelectionSetViewModel() 
    { 
     LineWidthIndex = -1; 
    } 
    private int _lineWidthIndex; 
    public int LineWidthIndex 
    { 
     get { return _lineWidthIndex; } 
     set { SetValue(ref _lineWidthIndex, value); } 
    } 

转换器:

public class IntToIntTextOrDefaultConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if ((int)value == -1) 
      return Fusion.App.Current.Resources["StrDefault"].ToString(); 

     return value.ToString(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     return value.Equals(true) ? parameter : Binding.DoNothing; 
    } 
} 
+0

幸运的可能是,绑定需要Mode = TwoWay? –

+0

当然,但Web上的示例都没有DataGridComboBoxColumn绑定定义中的Mode = TwoWay。我试图用两种不同的方式,但没有奏效。此外,文本列的工作模式= TwoWay。如果你有一个想法如何正确地把它放在XAML我会很高兴:) –

+0

由于我以前也使用复选框绑定,这里是我自己的代码的一部分:''。改了名字,但希望这有助于。 –

回答

1

似乎在某些情况下,例如在编辑文本列并按下回车或添加新行th之后e属性WAS在更改组合框值后实际更新(set called)。所以我只是添加UpdateSourceTrigger = PropertyChanged绑定和更新源属性立即发生(而不是一些随机操作后)。请注意,从ComboBox更改焦点不足以更新源属性,所以我认为它从未更新过。

<DataGrid Name="SelectionSetsGrid" CanUserAddRows="False" CanUserResizeColumns="True" CanUserSortColumns="True" 
       ItemsSource="{Binding SelectionSets}" AutoGenerateColumns="False" 
       SelectedItem="{Binding SelectedSelectionSet}"> 
     <DataGridComboBoxColumn Header="{StaticResource XpStrTopologyWidth}" SelectedItemBinding="{Binding LineWidthIndex, UpdateSourceTrigger=PropertyChanged}"> 
      <DataGridComboBoxColumn.ElementStyle> 
       <Style TargetType="ComboBox" BasedOn="{StaticResource Theme.ComboBox.Style}"> 
        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.LineWidths}"/> 
        <Setter Property="IsReadOnly" Value="True"/> 
        <Setter Property="ItemTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <WrapPanel> 
            <TextBlock Text="{Binding Converter={StaticResource IntToIntTextOrDefaultConverter}}" VerticalAlignment="Center"/> 
           </WrapPanel> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </DataGridComboBoxColumn.ElementStyle> 
      <DataGridComboBoxColumn.EditingElementStyle> 
       <Style TargetType="ComboBox" BasedOn="{StaticResource Theme.ComboBox.Style}"> 
        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.LineWidths}"/> 
        <Setter Property="ItemTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <WrapPanel> 
            <TextBlock Text="{Binding Converter={StaticResource IntToIntTextOrDefaultConverter}}" VerticalAlignment="Center"/> 
           </WrapPanel> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </DataGridComboBoxColumn.EditingElementStyle> 
     </DataGridComboBoxColumn>       
    </DataGrid.Columns> 
</DataGrid> 
相关问题