2017-07-04 13 views
0

他の列から何が選択されたかによって、セルを変更するデータグリッドがあります。データグリッド内でバインディングが更新されない

たとえば、私の最初の列には平日(enums)が表示されています。ユーザーが「Monday」を選択した場合、2番目の列のセルはTextBoxになります。ユーザーが別の日(金曜日など)を習うと、Text = "Hooray!"、それ以外の場合はTextblock Text = ""のTextblockになります。

TextboxとTextblockの両方が同じプロパティでバインドされます。しかし、このバインディングは機能しません。

XAML

<DataGrid Margin="0,10,0,0" 
          x:Name="dataGrid" 
          AutoGenerateColumns="False" 
          IsSynchronizedWithCurrentItem="True" 
          ItemsSource="{Binding TheCollection}" 
          SelectedItem="{Binding TheSelectedItemFromTheCollection}"> 
        <DataGrid.Columns> 
         <DataGridTemplateColumn Header="Days" 
               CanUserReorder="False" 
               CanUserResize="False" 
               CellTemplate="{StaticResource local.DataGridDays}" /> 
         <DataGridTemplateColumn Header="Value" 
               CanUserReorder="False" 
               CanUserResize="False" 
               CellTemplate="{StaticResource local.DataGridValue}" /> 
        </DataGrid.Columns> 
</DataGrid> 

<DataTemplate x:Key="local.DataGridValuesEditable"> 
    <StackPanel> 
     <Border Background="White" 
       BorderThickness="1" 
       Padding="4"> 
      <TextBox Text="{Binding InitialValue, RelativeSource={RelativeSource Self}, UpdateSourceTrigger=PropertyChanged}" 
        VerticalAlignment="Bottom" 
        Margin="0" /> 
     </Border> 
    </StackPanel> 
</DataTemplate> 
<DataTemplate x:Key="local.DataGridValuesDefault"> 
    <StackPanel> 
     <Border Background="White" 
       BorderThickness="1" 
       Height="30" 
       Padding="4"> 
      <TextBlock Text="{Binding InitialValue, Mode=TwoWay, RelativeSource={RelativeSource Self}, UpdateSourceTrigger=PropertyChanged}" 
         VerticalAlignment="Bottom" 
         Margin="0" 
         Width="55" /> 
     </Border> 
    </StackPanel> 
</DataTemplate> 
<DataTemplate x:Key="local.DataGridValue"> 
    <ContentControl> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="ContentTemplate" 
         Value="{DynamicResource local.DataGridValuesDefault}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedDay, UpdateSourceTrigger=PropertyChanged}" 
           Value="Monday"> 
         <Setter Property="ContentTemplate" 
           Value="{DynamicResource local.DataGridValuesEditable}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate> 

のViewModel ...助けてください

private ObservableCollection<TheModel> _theCollection; 

public ObservableCollection<TheModel> TheCollection 
{ 
    get 
    { 
     if (_theCollection == null) 
      _theCollection = new ObservableCollection<TheModel>(); 
     return _theCollection; 
    } 
    set 
    { 
     _theCollection = value; 
    } 
} 

private TheModel _theSelectedItemFromTheCollection; 

public TheModel TheSelectedItemFromTheCollection 
{ 
    get 
    { 
     if (_theSelectedItemFromTheCollection == null) 
      _theSelectedItemFromTheCollection = new TheModel(); 
     return _theSelectedItemFromTheCollection; 
    } 
    set 
    { 
     _theSelectedItemFromTheCollection = value; 
     NotifyPropertyChanged("TheSelectedItemFromTheCollection"); 
    } 
} 

モデル

public string SelectedDay 
{ 
    get { return day; } 
    set 
    { 
     day = value; 
     if (day == TheWeekDays.Friday.ToString()) 
     { 
      InitialValue = "Hooray!!"; 
     } 
     else 
      InitialValue = string.Empty;   
     NotifyPropertyChanged("SelectedDay"); 
    } 
} 

private string _initialValue; 
public string InitialValue 
{ 
    get { return _initialValue; } 
    set 
    { 
     _initialValue = value; 
     NotifyPropertyChanged("InitialValue"); 
    } 
} 

public IEnumerable<WeekDays> TheWeekDays 
{ 
    get 
    { 
     return Enum.GetValues(typeof(WeekDays)) 
        .Cast<WeekDays>(); 
    } 
} 
+1

'{バインディングInitialValue、RelativeSource = {RelativeSource Self}}'なぜこれが動作すると思われるのか説明できますか? – grek40

+0

まず、RelativeSource = {RelativeSource Self}はありません。しかし、私はそれを置くように努め、まだそれは動作していません。それ以外に何が変わる必要がありますか? –

+1

ビジュアルスタジオの出力ウィンドウを見ると、失敗したバインディングのエラーテキストが表示されます。私の推測:あなたは 'ContentControl.Content'プロパティを' Content = "{Binding}" 'と設定する必要がありますが、私は100%確実ではありません。 – grek40

答えて

0

され、次の希望状況:

DataContextのおよびlocal.DataGridValuesEditableは、行項目TheModelである必要があります。次のようにこのDataContext

、バインディングを書くことができる。

<TextBox Text="{Binding InitialValue,UpdateSourceTrigger=PropertyChanged}" 

<TextBlock Text="{Binding InitialValue}" 

DataContextlocal.DataGridValueの所望の項目を含みます。 ContentControlContentは、ContentTemplateDataContextになりますので、Contentは外側のDataContextにリンクする必要があります。また、トリガーのバインドを簡略化することができます:

<DataTemplate x:Key="local.DataGridValue"> 
    <ContentControl Content="{Binding}"> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="ContentTemplate" 
         Value="{DynamicResource local.DataGridValuesDefault}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedDay}" 
           Value="Monday"> 
         <Setter Property="ContentTemplate" 
           Value="{DynamicResource local.DataGridValuesEditable}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate> 
関連する問題