2016-09-18 19 views
0

私はDataGridComboBoxColumnに整数またはテキスト "Default"を表示することになっています。行を追加すると、コンボボックスはviewmodelのバウンドプロパティから正しい値を取得しますが、ユーザーインターフェイスで値を変更すると、プロパティのセットは呼び出されません。 SelectedValueBindingとSelectedItemBindingの両方を試しました。コンバータのConvertBackは決して呼び出されません。私はそれが呼び出されるべきであることを知らない。仕事DataGrid ComboBoxの値を変更しても、バインドされたプロパティがまったく更新されないのはなぜですか?

もの:ここで(息切れのためにここでは省略)両方の方法を結合

  • データグリッドの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のを実装し、値の代入は、の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); } 
    } 
} 

ビューモデルデータグリッド行の(ビューモデルはINotifyPropertyChangedのと値の代入がレイズの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を持っていません。私は2つの異なる方法でそれを入れようとしましたが、うまくいきませんでした。さらに、テキスト列はMode = TwoWayなしで動作します。もしあなたがXAMLに正しく置く方法を知っていれば私はうれしいでしょう:) –

+0

これまで私はチェックボックスのバインディングを使っていたので、ここに自分のコードの一部です: ''。名前を変更しましたが、これが役立つことを願っています。 –

答えて

1

テキスト列を編集してEnterキーを押すか新しい行を追加した後のような場合がありますeプロパティーコンボボックスの値を変更した後、実際に更新されました(呼び出されました)。 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> 
関連する問題