是否有一种干净和/或可接受的标准方式从 IValueConverter 引用回 ViewModel,或者这是否打破了 MVVM 模式?基本上,我想根据 ViewModel 的其他属性转换 UI 中的绑定数据。我想这与如何从 IValueConverter 引用回 Window/Page 是相同的问题,因为对控件的引用未传递给 Convert/ConvertBack 方法。
我有一个IValueConverter,可通过查找表将枚举值转换为本地化字符串,反之亦然。要找到正确的表,首先需要知道表的名称。通过转换方法将枚举值传递到转换器时,可以找到该值。当通过ConvertBack方法将字符串传递到转换器时,字符串不是(枚举类型是唯一的,但字符串值不是)。
该转换器在DataTemplates上用于数据网格和属性网格中使用的编辑器。
在一种情况下,可以将表的名称作为ConverterParameter传递,因为DataTemplate是动态生成的。另一方面,似乎不可能做到这一点。我当前的解决方案在Convert方法中查找表名,并将其存储在ConvertBack方法中使用(即IValueConverter保持对Convert和ConvertBack的调用之间的状态)。这假设Convert将始终在ConvertBack之前被调用,这似乎不是一个安全的假设。我正在使用转换器的每个绑定实例:
<converters:EnumToStringConverter x:Key="EnumToStringConverter" x:Shared="False"/>
Run Code Online (Sandbox Code Playgroud)
这样安全吗?还是会再次困扰我?转换器方法如下所示:
private string listName = null;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter == null)
{
parameter = ListManager.FindListNameFromObject(value);
}
listName = (string)parameter;
return ListManager.GetKeyFromValue((string)parameter, value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter == null)
{
parameter = listName;
}
return ListManager.GetValueFromKey((string)parameter, (string)value);
}
Run Code Online (Sandbox Code Playgroud)
我一直试图查看是否可行的另一种方法是在转换器上创建依赖项属性,并将其以某种方式绑定到集合的名称。有没有一种方法可以将转换器的DataContext设置为与其作用的绑定相同?当前,转换器是StaticResource,因此没有DataContext。
谢谢
我是Windows手机和Silverlight开发的新手.在我的学习练习中,我遇到了一个错误,这是我在这篇文章的标题上提到的.
我的主要目标是将图像文件保存并检索到SQLCE数据库,我使用了本教程http://antonswanevelder.com/2011/10/28/writing-an-image-to-sql-ce-linq-to -sql /
但是,我对此代码段有疑问
<Image Source="{Binding ItemImage, Converter={StaticResource ImageConverter}}" Stretch="UniformToFill"/>
我的想法是编译器找不到资源ImageConverter.我真的需要一个帮助.
我的代码是:MainPage.xaml
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="CallListListBoxItemTemplate">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding CallName}" Foreground="DarkCyan" FontSize="{StaticResource PhoneFontSizeLarge}"
VerticalAlignment="Top" Margin="12,12,0,0"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="PersonalInfoListBoxItemTemplate">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Image Source="{Binding PersonImage, Converter={StaticResource ImageConverters}}" Stretch="UniformToFill" Name="_personPhoto" />
Run Code Online (Sandbox Code Playgroud)
MainPage.xaml.cs中
public class ImageConverters : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, …Run Code Online (Sandbox Code Playgroud) 我想固定枚举我的应用程序颜色,即文本颜色、分隔符颜色和背景颜色,我不想每次使用时都输入相同的颜色,所以我想我可以传递对象名称(例如分隔符),并在转换器中将其转换为所需的颜色:这是我对IValueConverter类的实现:
class AppColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
{
var color = (string)value;
switch (color)
{
case "separator":
return Color.FromHex("c2bca8");
case "text":
return Color.FromHex("96907e");
default:
return Color.Default;
}
}
else
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我从我对数据绑定的了解中使用了它,但我只是想将一个字符串传递给 color 属性,并且转换器处理它,我添加了一个 ResourceDictionary:
<Controls:CustomPage.Resources>
<ResourceDictionary>
<Converters:AppColorConverter x:Key="colorConverter"/>
</ResourceDictionary>
</Controls:CustomPage.Resources>
Run Code Online (Sandbox Code Playgroud)
但是我如何使用它,这不起作用:
<Label Text="English"
VerticalOptions="CenterAndExpand"
HorizontalOptions="EndAndExpand"
TextColor="{separator, …Run Code Online (Sandbox Code Playgroud) 我一直在使用带数据触发器的值转换器时遇到问题.在我的一些代码,它似乎像DataTrigger的Path被应用到根元素,而不是风格适用于哪些元素.
我创建了一个简单的测试用例,我不明白它的行为.我希望它Button会变成红色或蓝色,具体取决于输入到DataTrigger转换器的值,但它Button根本没有受到影响!
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SimpleWpfApplication"
x:Class="SimpleWpfApplication.SimpleUserControl"
ToolTip="UserControl ToolTip">
<UserControl.Resources>
<local:SimpleConverter x:Key="SimpleConverter" />
</UserControl.Resources>
<Button ToolTip="Button ToolTip">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=ToolTip, Converter={StaticResource SimpleConverter}}"
Value="Button ToolTip">
<Setter Property="Background" Value="Red" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=ToolTip, Converter={StaticResource SimpleConverter}}"
Value="UserControl ToolTip">
<Setter Property="Background" Value="Blue" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
一个简单的转换器:
class SimpleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value; …Run Code Online (Sandbox Code Playgroud) 应该实现两个函数,我想知道我需要对输入做什么类型的验证以及如何管理错误.
Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
End Function
Run Code Online (Sandbox Code Playgroud)
我需要检查值的类型和参数的类型是否是我所期望的.
如果他们不是,我应该什么也不返回,并在另一个地方发现错误的行为?或者我应该在这里抛出异常或断言?
是否有最佳或建议的做法适用于此处?
我正在使用MVVM,以防它有所作为.
我的MainWindowViewModel有两个DependencyProperties,TheList和TheSelectedItem.List是List <Type>,TheSelectedItem是Type.
MainWindow有一个ComboBox.当MainWindowViewModel加载它抓住所有的组件实现类的列表IMyInterface的和设置的thelist了这一点.
这些类中的每一个都有一个名为DisplayName的自定义属性,它有一个参数,用于显示类的用户友好名称,而不是应用程序知道的类名.
我还有一个ValueConverter,其目的是将这些类型转换为显示名称.
public class TypeToDisplayName : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType.Name == "IEnumerable")
{
List<string> returnList = new List<string>();
if (value is List<Type>)
{
foreach (Type t in value as List<Type>)
{
returnList.Add(ReflectionHelper.GetDisplayName(t));
}
}
return returnList;
}
else
{ …Run Code Online (Sandbox Code Playgroud) 基本上,如果我有:
<TextBlock Text="{Binding MyValue, Converter={StaticResource TransformedTextConverter},
ConverterParameter=?}" />
Run Code Online (Sandbox Code Playgroud)
你将如何传递某种类型的项目作为ConverterParameter.我想我可以传入某种类型的分隔列表,但我不确定要使用哪种类型的分隔符,或者是否有内置方法传递参数数组?
我正在尝试将枚举转换为画笔,以便可以使用枚举变量来控制某些控件的颜色
我的枚举(不相关):
public enum Colors {
Red, Blue,
}
Run Code Online (Sandbox Code Playgroud)
这是我的转换器:
[ValueConversion(typeof(Colors), typeof(Brush))]
public class EnumToBrushConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
return (Brushes.Red);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我试图使用它来根据枚举的值更改标签的颜色(Color是Colors类型的公共属性):
<Grid>
<Grid.Resources>
<conv:EnumToBrushConverter x:Key="EnumToBrushConverter" />
</Grid.Resources>
<Label Content="fixed" Foreground="{Binding Path=Color, Converter=EnumToBrushConverter}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
构建窗口时,我得到以下异常:
System.Windows.Markup.XamlParseException occurred
Message='Set property 'System.Windows.Data.Binding.Converter' threw an exception.' Line number '9' and line position '11'.
Source=PresentationFramework
LineNumber=9 …Run Code Online (Sandbox Code Playgroud) 我意识到还有其他问题具有相同的标题,但是我尝试了所有这些解决方案都无济于事.我正在尝试使用我制作的转换器.我的其他转换器工作正常,这个新转换器是前一个转换粘贴,名称已更改,返回值已更改.
XAML
xmlns:local="clr-namespace:ARC"
<local:DoublerConvert x:Key="DoubleConverter"/> 'Doesn't work
<local:ValueConverter x:Key="NegativeConverter"/> 'Works fine
Run Code Online (Sandbox Code Playgroud)
码
Public Class ValueConverter
Implements IValueConverter
Public Function ProvideValue(serviceProvider As System.IServiceProvider) As Object
Return Me
End Function
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
Dim OldWidth As Integer = value
OldWidth = -OldWidth
Return OldWidth
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
Throw New NotImplementedException …Run Code Online (Sandbox Code Playgroud) ivalueconverter ×10
wpf ×8
c# ×4
data-binding ×3
xaml ×3
.net ×1
binding ×1
converter ×1
datatrigger ×1
enums ×1
exception ×1
mvvm ×1
silverlight ×1
types ×1
vb.net ×1