我为Expander控件创建了一种样式,如果其值为false,则应禁用扩展器,但它根本无法工作。无论IsCheckedIn是true还是false,我的扩展器始终保持启用状态。

<Style x:Key="CollapseIsCheckedInExpander" TargetType="{x:Type Expander}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsCheckedIn}" Value="False">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
    </Style.Triggers>
</Style>


这是我在数据网格中设置扩展器样式的地方:

<Expander Expanded="Expander_Expanded" Collapsed="Expander_Expanded" Style="{DynamicResource CollapseIsCheckedInExpander}"/>


我在后面有一个属性代码,称为“ IsCheckedIn”,然后根据要检查的卡车是否已经登记,将其值设置为true或false。

有什么我想念的吗?

编辑:

这是我的课:

public class TruckItems : INotifyPropertyChanged
{
    bool _isCheckedIn;
    public bool IsCheckedIn
    {
        get { return _isCheckedIn; }
        set
        {
            if (_isCheckedIn != value)
                _isCheckedIn = value;
            OnPropertyChanged("IsCheckedIn");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}


这是我定义IsCheckedIn的片段:

truckItem.TruckCurrentPhase = item.CurrentPhase; //Current value is "Not Started", so the IsCheckedIn value should be false in the code below
truckItem.IsCheckedIn = truckItem.TruckCurrentPhase == "Checked In" ? true : false;




我发现我的问题是使用RowHeaderTemplate。由于某种原因,它没有拾取我的绑定,但是DataGridTemplateColumn却...

这不起作用:

<DataGrid.RowHeaderTemplate>
    <DataTemplate>
        <Expander Expanded="Expander_Expanded" Collapsed="Expander_Expanded" Style="{StaticResource CollapseIsCheckedInExpander}"/>
    </DataTemplate>
</DataGrid.RowHeaderTemplate>


这确实有效:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Expander Expanded="Expander_Expanded" Collapsed="Expander_Expanded" Style="{StaticResource CollapseIsCheckedInExpander}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

最佳答案

我建立了一个简单的示例(使用Caliburn Micro进行绑定和通知...)。这对我来说可以。

这样,您可以简单地测试绑定。在应用程序运行时设置两个断点。如果更改复选框,则Breakpoint1应该触发,而Breakpoint2之后应触发(我想两次,以获取CheckBox的实际值和Expander IsEnabled的实际值)。如果断点没有触发,则必须检查DataContext(在原始代码中,DataContext必须是truckItem,而不是ViewModel ...您是否已检查?)。

a

 <CheckBox IsChecked="{Binding ExpanderEnable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">Enalble Expander</CheckBox>
 <Expander IsEnabled="{Binding ExpanderEnable, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
     <TextBlock>TestText</TextBlock>
 </Expander>


cs

 private bool _expanderEnable;

 public bool ExpanderEnable {
     get
     {
         return _expanderEnable; //Breakpoint2
     }
     set {
         if (value == _expanderEnable) return; //BreakPoint1
         _expanderEnable = value;
         OnPropertyChanged();
     }
 }

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

关于c# - 无法使用样式禁用WPF扩展器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39243345/

10-09 07:28