WPF在ViewModel.PropertyChanged事件上更改Button Content

我的尝试(下面)失败了: < Canvas x:Key =“Lock”... /> < Canvas x:Key =“Unlock”... /> < Style x:Key =“LockButtonStyle”TargetType =“{x:Type Button}”>     < Style.Triggers>         < DataTrigger Binding =“{Binding Path = IsReadOnly}”Value =“True”>             < DataTrigger.Setters>                 < Setter Property =“Content”Value =“{StaticResource Lock}”/>             < /DataTrigger.Setters>         < / DataTrigger>         < DataTrigger Binding =“{Binding Path = IsReadOnly}”Value =“False”>             < DataTrigger.Setters>                 < Setter Property =“Content”Value =“{StaticResource Unlock}”/>             < /DataTrigger.Setters>         < / DataTrigger>     < /Style.Triggers> < /样式> ... < Button Content =“{StaticResource Lock}”/> 当ViewModel上的IsReadOnly属性发生更改时,我试图让按钮更改(它使用“IsReadOnly”作为PropertyName触发INotifyPropertyChanged.PropertyChanged)。我错过了什么? .NET 3.5 答案(至少对我而言 - 不支持一般情况): 我刚刚为布尔属性绑定编写了一个快速转换器。 [ValueConversion(typeof(bool),typeof(object))] public class BooleanValueConverter:IValueConverter {     公共对象FalseValue {get;组; }     公共对象TrueValue {get;组; }     #region IValueConverter成员     public object Convert(对象值,类型targetType,                           对象参数,CultureInfo文化)     {         return(bool)值? this.TrueValue:this.FalseValue;     }     公共对象ConvertBack(对象值,类型targetType,                               对象参数,CultureInfo文化)     {         return object.Equals(this.TrueValue,value)?真假;     }     #endregion } ... < local:BooleanValueConverter x:Key =“LockOrUnlock”     TrueValue =“{StaticResource Unlock}”     FalseValue =“{StaticResource Lock}”/> ... < Button Content =“{Binding Path = IsReadOnly,                              Converter = {StaticResource LockOrUnlock}}“/>     
已邀请:
如果设置Button的属性“Content”,则无法使用触发器更改它,因为第一个优先。 尝试删除内容的设置,它应该工作,因为触发器将自己做正确的工作。     
您正在使用C#,这意味着布尔值的ToString()方法返回“true”和“false”;而VB.NET则返回“True”和“False”。 如果您将触发器更改为使用小写“true”和“false”而不是大写“True”和“False”,则原始代码将起作用。 测试了这段代码...... XAML:
<Window.Resources>
     <local:ViewModel x:Key="TheViewModel" />
    <Canvas x:Key="Lock">
        <TextBlock Text="Lock"/>
    </Canvas>
    <Canvas x:Key="Unlock">
        <TextBlock Text="Unlock"/>
    </Canvas>

    <Style x:Key="LockButtonStyle" TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="true">
                <DataTrigger.Setters>
                    <Setter Property="Content" Value="{StaticResource Lock}" />
                </DataTrigger.Setters>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="false">
                <DataTrigger.Setters>
                    <Setter Property="Content" Value="{StaticResource Unlock}" />
                </DataTrigger.Setters>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid DataContext="{StaticResource TheViewModel}">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <Button x:Name="LockButton" Style="{StaticResource LockButtonStyle}" />
    <Button x:Name="ChangeIsReadOnly" Content="Change State" Grid.Row="1" Click="ChangeIsReadOnly_Click"/>
</Grid>
窗口的C#:
public MainWindow()
{
    InitializeComponent();
}
private void ChangeIsReadOnly_Click(object sender, RoutedEventArgs e)
{
    ViewModel theViewModel = (ViewModel)FindResource("TheViewModel");
    theViewModel.IsReadOnly = !theViewModel.IsReadOnly;
}
ViewModel类的C#:
public class ViewModel : System.ComponentModel.INotifyPropertyChanged
{
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    private bool isReadOnly;
    public bool IsReadOnly
    {
        get
        {
            return isReadOnly;
        }
        set 
        {
            isReadOnly = value;
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("IsReadOnly"));
        }
    }
}
    

要回复问题请先登录注册