5

Silverlight (windows phone) アプリケーションで MVVM モデルを使用しています。ビューに「ステータス」というテキストブロックがあります。このテキストブロックには、トランザクションのステータスが表示されます。ユーザーが登録されていない場合、「You are not」というメッセージが表示されます。ここで登録してください」.「ここ」という言葉はハイパーリンクである必要があります.ユーザーが私たちに登録されている場合、「最後にログインしたのはxx-xx-xxxxです」と表示されます...

私の View.xaml には次のものがあります。

<TextBlock Name="lblStatusValue" 
           Text="{Binding Status}"  
           TextWrapping="Wrap"   FontSize="23"  
/>                                

ViewModel.cs には、baove コントロールのバインド用に定義されたプロパティがあります。

private string _Status;

public string Status
{
    get { return _Status; }
    set
    {
        if (value != _Status)
        {
            _Status = value;
            RaisePropertyChanged("Status");
        }
    }
}

特定の単語を選択して、表示したいメッセージのハイパーリンクにすることは可能ですか? MVVM どうすればこれを達成できますか?)

以下のようなコードを View.cs に追加する必要があり、 ViewModel.cs から実行することはできませんか?

wpf:実行時にハイパーリンクを追加する方法は?

4

1 に答える 1

3

ハックを使用する代わりに、シンプルできちんとした方法を試してみませんか? 2 つの異なるテキストを用意するのはどうですか。例えば

<Grid>
    <Label Text="{Binding YourNormalTextComesHere}" 
           Visibility="{Binding IsUserNew, Converter={StaticResource BoolToVisibilityConv}, ConverterParameter=Not}" />
    <StackPanel Orientation=Horizontal 
                Visibilty="{Binding IsUserNew, Converter={StaticResource BoolToVisibilityConv}}">
        <Label Text="Your not registered with us. Please register "/>
        <HyperLink NavigateUri="...">here</HyperLink>
    </StackPanel>
</Grid>

ユーザーが新規かどうかに応じて、ウェルカム テキストまたはテキスト リンクの組み合わせが表示されます。This SO post は、 a のHyperlink使用方法を示しています。

BooleanToVisibilityConverter組み込み( doc ) が否定をサポートしているかどうかわからないので、実装を提供しました。サンプル コードではコンバーターをインスタンス化していないことに注意してください。

[ValueConversion(typeof (bool?), typeof (Visibility))]
public class BoolToVisibilityConverter : IValueConverter
{
    public const string Invert = "Not";
    private const string TypeIsNotAllowed = "The type '{0}' is not allowed.";

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var boolValue = value as bool?;
        if (boolValue == null)
            throw new NotSupportedException(String.Format(TypeIsNotAllowed, value.GetType().Name));

        return ((boolValue.Value && !IsInverted(parameter)) || (!boolValue.Value && IsInverted(parameter))) 
            ? Visibility.Visible 
            : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var visibilityValue = value as Visibility?;
        if (visibilityValue == null)
            throw new NotSupportedException(String.Format(TypeIsNotAllowed, value.GetType().Name));

        return visibilityValue == Visibility.Visible && !IsInverted(parameter);
    }

    #endregion

    private static bool IsInverted(object param)
    {
        var strParam = param as string;
        if (param == null || string.IsNullOrEmpty(strParam))
            return false;

        return strParam.Equals(Invert, StringComparison.InvariantCultureIgnoreCase);
    }
}

あなたは麻生に精通しているので、残りは明らかだとMVVM思います

これが少し役立つことを願っています。

于 2013-11-01T08:48:12.990 に答える