2

簡単な質問: バインドされたコマンド .CanExecute が false を返す場合、ハイパーリンクを非表示にするにはどうすればよいですか?

xaml:

<TextBlock>
    <Hyperlink Command="{Binding IncludesCanExecuteCommand}">Link text</Hyperlink>
</TextBlock>

コード:

...
private ICommand _includesCanExecuteCommand;
....
    _includesCanExecuteCommand = new RelayCommand(ExecuteTheCommand, CanExecuteTheCommand);
....

public ICommand IncludesCanExecuteCommand
{
    get
    {
        return _includesCanExecuteCommand;
    }
}

....

public bool CanExecuteTheCommand()
{
    return BooleanResult();
}

public void ExecuteTheCommand()
{
    DoSomeWork();
}

CanExecute() 関数が false を返したときにリンクが折りたたまれるように、Textblock/Hyperlink (または必要に応じて実行) のスタイルを設定するにはどうすればよいですか? 私はもう試した:

<Hyperlink.Style>
    <Style TargetType="{x:Type Hyperlink}" BasedOn="{StaticResource DefaultHyperlinkStyle}">
        <Setter Property="TextBlock.Visibility" Value="Visible" />
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="TextBlock.Visibility" Value="Collapsed" />
            </Trigger>
        </Style.Triggers>
     </Style>
 </Hyperlink.Style>                        

また、スタイルをテキストブロック (ハイパーリンクに到達できません) とハイパーリンク内の実行 (可視性プロパティなし) に配置しようとしました。

すべてのアイデアがありがたく受け取りました!

4

4 に答える 4

2

私は今日これを見て多くの時間を費やしましたが、これを試すまで何もうまくいきませんでした. 基本的に解決策は、ハイパーリンク内のテキストをテキストブロックに配置し、ハイパーリンクが無効になると内部の TextBlock が無効になるため、BooleanToVisiblityConverter を使用して可視性を設定することです。

<UserControl.Resources>
    <converters:BooleanToVisibiltyConverter x:Key="BooleanToVisibiltyConverter" />
</UserControl.Resources>

<TextBlock >
    <Hyperlink Command="{Binding EditDetailsCommand}">
        <TextBlock
            Visibility="{Binding Path=IsEnabled
                , RelativeSource={RelativeSource Self}
                , Mode=OneWay
                , Converter={StaticResource BooleanToVisibiltyConverter}}">
        Edit Details 
        </TextBlock>
    </Hyperlink>                  
</TextBlock >


public class BooleanToVisibiltyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            throw new ArgumentNullException("value"); 

        if (!(value is bool))
            throw new ArgumentException("Expected type of value must be boolean");

        if (parameter != null && !(parameter is Visibility))
            throw new ArgumentException("Expected type of parameter must be Visibility");

        Visibility falseVisibility = Visibility.Collapsed;

        if (parameter != null)
        {
            falseVisibility = (Visibility)parameter;

            if (falseVisibility == Visibility.Visible)
            {
                throw new ArgumentException("Cannot pass visible to expected false value parameter.");
            }
        }

        return (bool)value ? Visibility.Visible : falseVisibility;  
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            throw new ArgumentNullException("value"); 

        if (!(value is Visibility))
            throw new ArgumentException("Expected type of value must be Visibility");

        if (value == null)
        {
            throw new ArgumentNullException("value"); 
        }

        Visibility v = (Visibility)value;

        return v == Visibility.Visible;
    }
}
于 2013-02-26T19:42:48.927 に答える
0

したがって、ここには2つの問題があるようです..

私はおそらく、IncludesCanExecuteCommand.RaiseCanExecuteChanged() を呼び出した後にプロパティを設定したくなるでしょう。これにより、コマンドはその CanExecuteCommand を再評価します..

ハイパーリンクをパネルに配置し、可視性を 1 のプロパティにバインドします。) コンバーターを使用して、Collapsed、Visible などの有効な Visiblility 列挙型を返します。

わかりやすくするために-次のようなもの

<StackPanel Visibility="{Binding IsHyperlinkVisible, Mode=TwoWay,     Converter=boolToVisibilityConverter}">
  <TextBlock>
    <Hyperlink Command="{Binding WhateverTheHyperlinkDoesCommand}">Link text</Hyperlink>
</TextBlock>
</StackPanel>

ビューモデルは次のようになります (ビューモデルベースが NotifyPropertyChanged のいくつかのバージョンを実装している場合...

 public class ViewModel : NotificationViewModelBase 
 {
        public ViewModel()
        {
            this.WhateverTheHyperlinkDoesCommand =
                new DelegateCommand<object>(
                    this.ExecuteWhateverTheHyperlinkDoesCommand, this.CanWhateverTheHyperlinkDoesCommand);
        }

        private void ExecuteWhateverTheHyperlinkDoesCommand(object arg)
        {
            this.SomeOtherProperty = true;            }

        private bool someOtherProperty;

        public bool SomeOtherProperty
        {
            get
            {
                return this.someOtherProperty;
            }

            set
            {
                if (this.ChangeAndRaisePropertyChanged(
                    () => this.SomeOtherProperty, value, ref this.someOtherProperty))
                {
                    this.WhateverTheHyperlinkDoesCommand.RaiseCanExecuteChanged();
                }
            }
        }

            private bool isHyperlinkProperty;

        public bool IsHyperlinkProperty
        {
            get
            {
                return this.isHyperlinkProperty;
            }

            set
            {
                this.ChangeAndRaisePropertyChanged(() => this.IsHyperlinkProperty, value, ref this.isHyperlinkProperty);
            }
        }

        private bool CanWhateverTheHyperlinkDoesCommand(object obj)
        {
            // So based on a certain condition - lets say some other property

            if (this.SomeOtherProperty == false)
            {
                this.IsHyperlinkProperty = true;
                return false;
            }

            this.IsHyperlinkProperty = false;
            return true;
        }

        public DelegateCommand<object> WhateverTheHyperlinkDoesCommand { get; set; }

} }

于 2012-12-05T13:46:37.617 に答える
0

ハイパーリンクには TextBlock.Visibility の添付プロパティはありません。ハイパーリンクの含まれている TextBlock にスタイルを直接配置すると、可視性が解決されます。

そうでない場合は、bool から可視性へのコンバーターを作成し、Visibility の TextBlock にコンバーターを設定します。コンバーターを CanExecuteTheCommand プロパティにバインドします。

プロパティ変更通知が CanExecuteTheCommand プロパティで発生しない場合、コンバーターはビューが最初に読み込まれたときにのみ評価されることに注意してください。その後、古くなります。

于 2012-12-05T14:27:44.807 に答える
0

ハイパーリンクに名前を付けることも機能し、ある程度の柔軟性が得られます。また、組み込みの を使用することもできますBooleanToVisibilityConverter

<UserControl.Resources>
    <BooleanToVisibilityConverterx:Key="BooleanToVisibilityConverter" />
</UserControl.Resources>

<TextBlock Visibility="{Binding Path=IsEnabled,
                                ElementName=Linky,
                                Mode=OneWay,
                                Converter={StaticResource BooleanToVisibilityConverter}}">>
    <Hyperlink x:Name="Linky" Command="{Binding EditDetailsCommand}">
        <Run Text="Edit Details"/>
    </Hyperlink>                  
</TextBlock >
于 2015-03-30T22:47:53.707 に答える