使用UniversalValueConverter(或任何转换器)将字符串绑定到Path.Data的问题

时间:2014-05-07 06:45:06

标签: wpf data-binding mvvm valueconverter pathgeometry

我正在尝试使用字符串属性来使用ValueConverter更新路径数据。我认为最简单的方法就是展示它:(我正在使用WPF和MVVM模式。还使用MVVM Light)

在我的ViewModel中:

    private string _icon = "F1 M 34.7541,26.4939L 20.5932,1.72809C 19.9132,0.624023 18.9211,0.0480042 17.6171,0C 16.265,0.0480042 15.2729,0.624023 14.6409,1.72809L 0.480042,26.4939C 0.151978,27.0559 -0.00799561,27.6424 0,28.2534C 0.0289917,29.2073 0.378998,29.9982 1.05005,30.6259C 1.72107,31.2536 2.53915,31.579 3.50421,31.6022L 31.7299,31.6022C 32.693,31.5848 33.503,31.271 34.1601,30.6607C 34.8171,30.0504 35.1591,29.248 35.1861,28.2534C 35.1861,27.6424 35.0421,27.0559 34.7541,26.4939 Z M 15.0729,8.06448L 20.2092,8.06448L 20.2092,19.7072L 15.0729,19.7072L 15.0729,8.06448 Z M 17.665,22.4372C 18.4991,22.4576 19.1832,22.7468 19.7172,23.3048C 20.2512,23.8628 20.5272,24.5674 20.5453,25.4186C 20.5272,26.2444 20.2512,26.9266 19.7172,27.4652C 19.1832,28.0039 18.4991,28.2829 17.665,28.3022C 16.831,28.2829 16.147,28.0039 15.6129,27.4653C 15.0789,26.9266 14.8029,26.2444 14.7849,25.4186C 14.8029,24.546 15.0789,23.8353 15.6129,23.2864C 16.147,22.7376 16.831,22.4545 17.665,22.4372 Z " ;
    public string Icon
    {
        get { return _icon; }
        set
        {
            _icon = value;
            RaisePropertyChanged(() => Icon);
        }
    }

此字符串的目的是我可以为我的应用程序中的不同事件更新带有不同字符串(图标)的图标(XAML图标)。

在我的观点中:

<UserControl.Resources>
    <local:UniversalValueConverter x:Key="UniversalValueConverter"/>
<UserControl.Resources>

我有一个数据网格,其中一列包含:

                <DataGridTemplateColumn Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                            <Viewbox RenderTransformOrigin="0.5,0.5" Margin="3" MaxHeight="10">
                                <Viewbox.RenderTransform>
                                    <TransformGroup>
                                    </TransformGroup>
                                </Viewbox.RenderTransform>
                            <Path Stretch="Uniform" Fill="Red" Data="{Binding Path=Icon, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=UniversalValueConverter}}"/>
                            </Viewbox>                        
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

我的ValueConverter是这样的:

public class UniversalValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // obtain the conveter for the target type
        TypeConverter converter = TypeDescriptor.GetConverter(targetType);

        try
        {
            // determine if the supplied value is of a suitable type
            if (converter.CanConvertFrom(value.GetType()))
            {
                // return the converted value
                return converter.ConvertFrom(value);
            }
            else
            {
                // try to convert from the string representation
                return converter.ConvertFrom(value.ToString());
            }
        }
        catch (Exception)
        {
            return value;
        }

    }

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

我对价值转换器的工作方式或如何使用它们并不熟悉。但是我已经尝试过网上不同的价值转换器。 (我之前在其他情况下成功使用了值转换器)这两者都像UniversalValueConverter,还有StringToPathGeometryConverter。什么都行不通。当我运行我的应用程序时,不会显示任何图标。但也没有例外。

我还尝试将Icon属性设置为PathGeometry,并在没有值转换器的情况下绑定它,但它也不起作用。

有谁知道?

1 个答案:

答案 0 :(得分:1)

这可能是由于您的xaml文件中的绑定 DataContext 未正确设置。检查 Visual Studio输出窗口以查看运行时是否存在任何绑定错误

为使xaml中的Bindings正常工作,您必须将根Window对象的DataContext属性设置为正确的对象或正确设置为xaml元素/控件。

在您的情况下,您必须确保ViewModel的Icon属性流动并正确绑定到您的xaml Path元素。

有关DataBinding的更多信息,请参阅: