他の列から何が選択されたかによって、セルを変更するデータグリッドがあります。データグリッド内でバインディングが更新されない
たとえば、私の最初の列には平日(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>();
}
}
'{バインディングInitialValue、RelativeSource = {RelativeSource Self}}'なぜこれが動作すると思われるのか説明できますか? – grek40
まず、RelativeSource = {RelativeSource Self}はありません。しかし、私はそれを置くように努め、まだそれは動作していません。それ以外に何が変わる必要がありますか? –
ビジュアルスタジオの出力ウィンドウを見ると、失敗したバインディングのエラーテキストが表示されます。私の推測:あなたは 'ContentControl.Content'プロパティを' Content = "{Binding}" 'と設定する必要がありますが、私は100%確実ではありません。 – grek40