wpf - 从 MVVM 更改 DynamicResource

标签 wpf xaml mvvm

我正在尝试将 DynamicResource 值绑定(bind)到位于 viewmodel 中的公共(public)属性,然后再对其进行操作。静态资源基本上显示的是图像。任何建议,谢谢。

 <Rectangle Width="20" Height="20">
     <Rectangle.Fill>
         <VisualBrush Stretch="Fill" Visual="{StaticResource appbar_page_number1}" />
     </Rectangle.Fill>
 </Rectangle>

最佳答案

如果您有固定数量的资源并且想要将枚举转换为资源,那么您可以使用绑定(bind)转换器。像这样的东西:

public enum PossibleValue
{
    Value1,
    Value2,
    Value3,
    Value4
}

转换器看起来像:
public class EnumToVisualConverter : IValueConverter
{

    public Visual Visual1 { get; set; }
    public Visual Visual2 { get; set; }
    public Visual Visual3 { get; set; }
    public Visual Visual4 { get; set; }



    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(value is PossibleValue))
            return null; //Or a some default Visual

        PossibleValue val = (PossibleValue)value;

        switch (val)
        {
            case PossibleValue.Value1:
                return Visual1;
            case PossibleValue.Value2:
                return Visual2;
            case PossibleValue.Value3:
                return Visual3;
            default:
                return Visual4;
        }
    }

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

然后在资源部分声明转换器:
<l:EnumToVisualConverter x:Key="myConverter"
        Visual1="{StaticResource appbar_page_number1}"
        Visual2="{StaticResource appbar_page_number2}"
        Visual3="{StaticResource appbar_page_number3}"
        Visual4="{StaticResource appbar_page_number4}"/>

现在将矩形与 VM 中的属性链接起来(我们称这个属性为 MightyProperty)。
<Rectangle Width="20" Height="20">
    <Rectangle.Fill>
        <VisualBrush Stretch="Fill" Visual="{Binding MightyProperty, Converter={StaticResource myConverter}}" />
    </Rectangle.Fill>
</Rectangle>

这样,每次 MightyProperty 将在您的 View 模型中更改时,转换器将找到适当的视觉并将其发送到 VisualBrush 的 Visual 属性。

当然 MightyProperty 不必是 Enum 类型,它可以是 int 字符串或任何其他类型。您只需调整 Convert 方法中的代码以匹配您的类型。

关于wpf - 从 MVVM 更改 DynamicResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999072/

相关文章:

c# - 如何使用 MVVM WPF 架构创建自定义用户控件

wpf - AvalonEdit - 用于 JSON 突出显示的 xshd

c# - XAML DataTemplate 数据绑定(bind)

wpf - 绑定(bind)到 ObservableCollection MVVM 的 TabControl

c# - 使用 WPF 和 MVVM 模式将值从子窗口传递到父窗口

.net - XAML 语法错误阻碍了设计器,但编译正常

c# - 如何从 Gridview 列内的超链接单击事件中获取绑定(bind)数据

c# - 如何将功能按钮添加到 UWP XAML 中的列表框项

silverlight - 如何限制 slider 的值更改事件?

wpf - 实体类实现的IDataErrorInfo