Tmplateで生成したTextBoxに対してStyleのTriggerが動きません。
CheckBoxのON,OFFでTextBoxのIsReadOnlyプロパティを切り替えたいと考えています。
以下のソースではGrid直下のTextBoxではTriggerが動き、CheckBoxと連動してIsReadOnlyが変動します。
しかし、ListBox内のTextBoxではCheckBoxの値に関係なく、常にReadOnlyとなってしまいます。
Template内のコレクションにもStyle Triggerを適用させる方法を教えて下さい。
class TextBoxModel
{
public string text { get; set; }
public int count { get; set; }
public TextBoxModel(string text, int count)
{
this.text = text;
this.count = count;
}
}
class MainWindowViewModel : INotifyPropertyChanged
{
public List<TextBoxModel> tbm { get; set; }
private bool _isReadOnly;
public bool IsReadOnly
{
get { return _isReadOnly; }
set
{
_isReadOnly = value;
OnPropertyChanged(nameof(IsReadOnly));
}
}
public MainWindowViewModel()
{
tbm = new List<TextBoxModel>()
{
new TextBoxModel("aaa", 10),
new TextBoxModel("fff", 10)
};
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<Style x:Key="ReadOnlyTextBox" TargetType="TextBox">
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="HorizontalAlignment" Value="Left"></Setter>
<Setter Property="TextWrapping" Value="Wrap"></Setter>
<Setter Property="VerticalAlignment" Value="Top"></Setter>
<Setter Property="Width" Value="100"></Setter>
<!--ここがtemplate内のTextBoxに適用されない-->
<Style.Triggers>
<DataTrigger Binding="{Binding IsReadOnly}" Value="False">
<Setter Property="IsReadOnly" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TextBox x:Name="textBox" Style="{StaticResource ReadOnlyTextBox}" Height="23" Margin="10,10,0,0" Text="TextBox"/>
<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="120" Margin="162,10,0,0" VerticalAlignment="Top" Width="108" ItemsSource="{Binding tbm}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBox Style="{StaticResource ReadOnlyTextBox}" Text="{Binding text}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<CheckBox x:Name="checkBox" Content="ReadOnly" HorizontalAlignment="Left" Margin="324,20,0,0" VerticalAlignment="Top" IsChecked="{Binding IsReadOnly}"/>
</Grid>