1

画像とテキストを含むボタンがあり、バインドされたプロパティの値に応じて、画像、テキスト、またはその両方を表示するコードを作成しています。コードは現在、StylesとDataTriggersを使用しています。

public enum ButtonStyle { Image, Text, Both };

public class ViewModel : INotifyPropertyChanged
{
    private ButtonStyle _buttonStyle;
    public ButtonStyle buttonStyle
    {
        get { return this._buttonStyle; }
        set
        {
            this._buttonStyle = value;
            notifyPropertyChanged("buttonStyle");
        }
}

と:

<UserControl.Resources>
    <Style x:Key="buttonTextStyle" TargetType="{x:Type Label}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=buttonStyle}"
                    Value="{x:Static local:ButtonStyle.Text}">
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="buttonImageStyle" TargetType="{x:Type Image}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=buttonStyle}"
                    Value="{x:Static local:ButtonStyle.Image}">
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>


<Button>
    <StackPanel>
        <Image Source="..." Style="{StaticResource buttonImageStyle} />
        <Label Style={StaticResource buttonTextStyle}>My Text</Label>
    </StackPanel>
</Button>

私の問題?ビューモデルのbuttonStyleプロパティの値を変更しても、ボタンは変更されません。このコントロールはタブ内にあり、別のタブに切り替えてから元に戻すと、buttonStyleプロパティの現在の値を反映するようにボタンが更新されますが、変更するまで変更されません。

DataTriggerは、コントロールがレンダリングされたときにのみ処理され、バインドされた値がPropertyChangedイベントを発生させたにもかかわらず、バインドされた値が変更されたときに再レンダリングされないように見えます。

何か案は?

4

3 に答える 3

2

各データトリガーでNotifyOnSourceUpdated=Trueを試してください。

        <DataTrigger Binding="{Binding Path=buttonStyle, NotifyOnSourceUpdated=True}"
                Value="{x:Static local:ButtonStyle.Text}">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
于 2012-10-18T22:42:06.710 に答える
1

これは、DataTriggerの列挙型を参照するためのより良い方法だと思います。

    <Style x:Key="buttonImageStyle" TargetType="{x:Type Image}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=buttonStyle}">
                <DataTrigger.Value>
                    <local:ButtonStyle>Text</local:ButtonStyle>
                </DataTrigger.Value>
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

リソースの値は実行時に変更されるため、StaticResourceの代わりにDynamicResourceを使用する必要があります。

Style="{DynamicResource buttonImageStyle}"
于 2012-10-19T07:05:14.340 に答える
1

ここにアイデアがあります-バインディングの問題があり、INotifyPropertyChangedが機能していないように見えるときはいつでも、PropertyChangedEventArgs()で、プロパティの名前を正しく入力したことを確認して再確認してください。

ご迷惑おかけして申し訳ありません。

于 2012-10-19T16:29:01.743 に答える