2

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

<Canvas x:Key="锁定" ... />
<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>
        </DataTrigger>
        <Da​​taTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
            <Da​​taTrigger.Setters>
                <Setter Property="Content" Value="{StaticResource Unlock}" />
            </DataTrigger.Setters>
        </DataTrigger>
    </Style.Triggers>
</样式>

...

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

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

.NET 3.5

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

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

[值转换(类型(布尔),类型(对象))]
公共类 BooleanValueConverter : IValueConverter
{
    公共对象 FalseValue { 获取;放; }
    公共对象 TrueValue { 获取;放; }

    #region IValueConverter 成员

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

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

    #endregion
}

...

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

...

<Button Content="{绑定路径=IsReadOnly,
                             转换器={StaticResource LockOrUnlock}}" />
4

2 回答 2

5

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

于 2010-07-18T08:16:55.123 回答
2

您正在使用 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"));
        }
    }
}
于 2018-03-07T15:47:33.500 回答