WPF 更改 ViewModel.PropertyChanged 事件上的按钮内容

Tra*_*man 2 .net wpf triggers datatrigger

我的尝试(如下)失败了:

<Canvas x:Key="Lock" ... />
<Canvas x:Key="解锁" ... />

<Style x:Key="LockButtonStyle" TargetType="{x:Type Button}">
    <样式.触发器>
        <Da​​taTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
            <Da​​taTrigger.Setters>
                <Setter Property="Content" Value="{StaticResource Lock}" />                           
            </DataTrigger.Setters>
        </数据触发器>
        <Da​​taTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
            <Da​​taTrigger.Setters>
                <Setter Property="Content" Value="{StaticResource Unlock}" />
            </DataTrigger.Setters>
        </数据触发器>
    </Style.Triggers>
</样式>

...

<Button Content="{StaticResource Lock}" />

我试图让按钮在 ViewModel 上的 IsReadOnly 属性更改时更改(它以“IsReadOnly”作为 PropertyName 触发 INotifyPropertyChanged.PropertyChanged)。我错过了什么?

.NET 3.5

答案(至少对我来说 - 不支持一般情况):

我刚刚为布尔属性绑定编写了一个快速转换器。

[ValueConversion(typeof(bool), typeof(object))]
公共类 BooleanValueConverter : IValueConverter
{
    公共对象 FalseValue { 获取;放; }
    公共对象 TrueValue { 获取;放; }

    #region IValueConverter 成员

    公共对象转换(对象值,类型目标类型, 
                          对象参数,CultureInfo 文化)
    {
        返回(布尔)值?this.TrueValue : this.FalseValue;
    }

    公共对象 ConvertBack(对象值,类型目标类型, 
                              对象参数,CultureInfo 文化)
    {
        返回 object.Equals(this.TrueValue, value) ?真假;
    }

    #endregion
}

...

<local:BooleanValueConverter x:Key="LockOrUnlock" 
    TrueValue="{静态资源解锁}" 
    FalseValue="{静态资源锁}" />

...

<Button Content="{绑定路径=IsReadOnly, 
                             Converter={StaticResource LockOrUnlock}}" />

Mau*_*lli 5

如果您设置按钮的属性“内容”,则不能使用触发器更改它,因为第一个优先。
尝试删除 Content 的设置,它应该可以工作,因为触发器会自己做正确的工作。