2

私のビューの1つは、UserControlsそれぞれが特定のオブジェクトに関するデータを表示する5つで構成されています。たとえば、ビューに当社の牛が表示され、画面に牛1〜5が表示されているとします(それぞれ独自のUserControlにあります)。

私がやりたいのは(しかし可能かどうかはわかりませんが)、牛のステータスをそれぞれのUserControlで使用されているスタイルにバインドすることです。したがって、たとえば、などのプロパティstatusがあります。牛の場合、「通常の」スタイルを表示したい場合、背景を赤にしたい場合、テキストを黒にし、フォントサイズを大きくしたい場合。okhungrydeadokhungrydead

達成しようとしていることの簡略化されたバージョンを追加しました。ただし、WPFスタイル/リソース辞書に関する私の知識はまだいくらか制限されています。

基本的にコードに必要なものプロパティ
を持つViewModelStatus

class CowInfoViewModel : Screen
{
    public string Name { get; set; }

    public string Status { get; set; } //"ok", "hungry", "dead"
}

スタイルまたはリソース辞書を取得するビュー

<UserControl x:Class="WpfModifyDifferentView.Views.CowInfoView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- A reference to a ResourceDictionary with styles, that is bound to the 'Status' property -->

    <StackPanel>
        <TextBlock x:Name="Name" Text="Cow Name"/>
        <TextBlock x:Name="Status" Text="Ok" />
    </StackPanel>
</UserControl>

編集-解決策:

私はValeの答えを使って次のことをしました:

xaml(コンバーターへの参照):

    <UserControl.Resources>
        <Converters:CowStyleConverter x:Key="styleConverter" />
    </UserControl.Resources>

xaml(要素):

        <TextBlock x:Name="Name" Text="Cow Name" Style="{Binding Path=Style, ConverterParameter='TextBlockCowName', Converter={StaticResource styleConverter}}" />

コンバーター(チェックを省略したことに注意してください):

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var status = value.ToString();
        var styleName = parameter.ToString();

        _resourceDictionary.Source = new System.Uri(string.Format("pack://application:,,,/Resources/ScreenI2Style{0}.xaml", status));

        return _resourceDictionary[styleName];
    }

次に、次のようなスタイルで複数のResourceDictionariesを作成しました。

<Style x:Key="TextBlockCowName" TargetType="TextBlock">
    <Setter Property="Foreground" Value="{StaticResource SomeBrush}" />
</Style>
4

1 に答える 1

1

UserControl StyleプロパティをStatusにバインドして、コンバーターを使用できます。

<UserControl x:Class="WpfModifyDifferentView.Views.CowInfoView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             xmlns:local="clr-namespace:WpfModifyDifferentView"
             Style="{Binding Path=Status, Converter={StaticResource myConverter}}">
        <UserControl.Resources>
            <local:MyConverter x:Key="myConverter" />
        </UserControl.Resources>

コンバーターはWpfModifyDifferentViewに直接あると思います。コンバーターは次のようになります。

public class MyConverter : IValueConverter {
        private ResourceDictionary dictionary;

        public MyConverter() {
            if (dictionary == null) {
                dictionary = new ResourceDictionary();
                dictionary.Source = new Uri("pack://application:,,,/WpfModifyDifferentView;Component/Resources/Styles.xaml");
            }
        }
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            switch (value.ToString()) {
                case "ok":
                    return dictionary["myKeyForOkStyle"] as Style;
                case "hungry":
                    return dictionary["myKeyForHungryStyle"] as Style;
                case "dead":
                    return dictionary["myKeyForDeadStyle"] as Style;
                default:
                    return null;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            throw new NotImplementedException();
        }
    }

もちろん、正しいURIを指定する必要があります。

于 2012-08-27T10:17:24.380 に答える