私のビューの1つは、UserControls
それぞれが特定のオブジェクトに関するデータを表示する5つで構成されています。たとえば、ビューに当社の牛が表示され、画面に牛1〜5が表示されているとします(それぞれ独自のUserControlにあります)。
私がやりたいのは(しかし可能かどうかはわかりませんが)、牛のステータスをそれぞれのUserControlで使用されているスタイルにバインドすることです。したがって、たとえば、などのプロパティstatus
があります。牛の場合、「通常の」スタイルを表示したい場合、背景を赤にしたい場合、テキストを黒にし、フォントサイズを大きくしたい場合。ok
hungry
dead
ok
hungry
dead
達成しようとしていることの簡略化されたバージョンを追加しました。ただし、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>