20993


CheckBoxのON,OFFでTextBoxのIsReadOnlyプロパティを切り替えたいと考えています。  
以下のソースではGrid直下のTextBoxではTriggerが動き、CheckBoxと連動してIsReadOnlyが変動します。  
しかし、ListBox内のTextBoxではCheckBoxの値に関係なく、常にReadOnlyとなってしまいます。  
Template内のコレクションにもStyle Triggerを適用させる方法を教えて下さい。

* * *
[code]

    class TextBoxModel
    {
        public string text { get; set; }
        public int count { get; set; }
    
        public TextBoxModel(string text, int count)
        {
            this.text = text;
            this.count = count;
        }
    }
    
[/code]

* * *
[code]

    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));
        }
    }
    
[/code]

* * *
[code]

    <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>
    
[/code]


CC BY-SA 3.0
2016-01-17T06:17:10.913
20992
2016-01-17T06:31:42.220
14034
question
wpf xaml
Tmplateで生成したTextBoxに対してStyleのTriggerが動きません。


`TextBox`の`DataContext`は`MainWindowViewModel`ではなく`TextBoxModel`のため、`{Binding
IsReadOnly}`は無効です。

修正するにはVMの設計を変えて`TextBoxModel`から`IsReadOnly`をたどれるようにするか、`RelativeSource`を用いて

[code]

    {Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=DataContext.IsReadOnly}
    
[/code]

のように上の階層の要素を経由して参照する必要があります。


CC BY-SA 3.0
2016-01-17T06:31:42.220
20993
2016-01-17T06:31:42.220
5750
20992
answer