C# WPF难以绑定:使用静态方法的结果作为输入将值绑定到IConverter
我想知道是否有可能有以下类型的绑定,但我无法形成一个搜索查询来给出明确的答案,也无法在任何地方找到它 情况就是这样 我有一个带有“Items”(一个自定义类)的列表框,这些项目使用项目模板显示。我使用转换器来计算背景颜色。见下文:C# WPF难以绑定:使用静态方法的结果作为输入将值绑定到IConverter,c#,wpf,xaml,data-binding,converter,C#,Wpf,Xaml,Data Binding,Converter,我想知道是否有可能有以下类型的绑定,但我无法形成一个搜索查询来给出明确的答案,也无法在任何地方找到它 情况就是这样 我有一个带有“Items”(一个自定义类)的列表框,这些项目使用项目模板显示。我使用转换器来计算背景颜色。见下文: <Window.Resources> <local:MyConverter x:Key="myConverter"/> </Window.Resources> <!-- snip --> <ListBox
<Window.Resources>
<local:MyConverter x:Key="myConverter"/>
</Window.Resources>
<!-- snip -->
<ListBox Grid.Row="2" Name="listBoxMaterialType" Margin="0,0,0,0" ItemsSource="{Binding Path=MyItems, ElementName=MySource}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayText}" Background="{Binding Converter={StaticResource myConverter}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
现在为了更好的抽象,我希望MyConverter不转换项目,而只转换项目的分数。一个项目不知道它自己的分数,但是该分数是通过调用MyStaticClass.MyStaticMethod(项目)来计算的;所以在代码中,我想做如下绑定:myTextBlock.Background=MyConverter(MyStaticClass.MyStaticMethod(item));在WPF中使用数据绑定可以做到这一点吗?当然,转换器通过应用您描述的静态函数来完成其工作:从项目到颜色。一切顺利 如果你认为颜色在分数上有一定的变化,问题就会出现。您认为通过哪种方式可以触发绑定来更新颜色值(从而调用转换器) 我想这更像是一个结构性问题,而不是技术性问题 编辑: 要么我不理解这个问题,要么解决方案很简单:
public class MyConverter
: IValueConverter
{
public object Convert(
object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
return MyStaticClass.MyStaticMethod(value as MyItem);
}
public object ConvertBack(
object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我还要在binding子句中添加Mode=OneTime
干杯传统上,ViewModel的角色是获取您的域对象并公开视图所需的数据。这可能包括添加新的属性,这些属性是模型属性的聚合或转换(例如,通过连接FirstName和姓氏模型属性来提供全名属性)。就你而言:
public class Item
{
public string DisplayText { get; set; }
}
public class ItemViewModel
{
private Item _model;
public string DisplayText
{
get { return _model.DisplayText; }
}
public int Score
{
get { return MyStaticClass.MyStaticMethod(_model);
}
}
然后,使用ViewModel作为数据上下文,您可以将转换器直接绑定到Score属性。您可以做很多事情,例如,您可以向转换器添加一些属性,这些属性将转换器指向一个方法。例如,
TargetType
,TargetObject
和MethodName
,然后您可以通过指定MethodName
和任何其他属性,使转换器对TargetObject
或静态地调用方法
e、 g.类似这样的情况:
//<Property declarations>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool staticCall = TargetObject == null;
var types = new Type[] { value.GetType() };
var args = new object[] { value };
MethodInfo method;
if (staticCall)
{
method = TargetType.GetMethod(MethodName, types);
}
else
{
method = TargetObject.GetType().GetMethod(MethodName, types);
}
var score = method.Invoke(TargetObject, args);
//Convert score
}
//
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
bool staticCall=TargetObject==null;
变量类型=新类型[]{value.GetType()};
var args=新对象[]{value};
方法信息法;
如果(静态调用)
{
method=TargetType.GetMethod(方法名,类型);
}
其他的
{
method=TargetObject.GetType().GetMethod(方法名,类型);
}
var score=method.Invoke(TargetObject,args);
//换算分数
}
(与所有粗略的片段一样,不要盲目复制粘贴此内容,它可能很糟糕)
我只需要从分配给项目的分数到控件背景色的单向(一次)绑定。分数不会改变,也不能改变颜色来改变分数。我目前使用你在转换器内应用静态函数的方法,但这将我的转换器与记分器紧密地联系在一起。关于编辑:这是我想要避免的代码(虽然转换器首先转换MyStaticMethod的返回值),但我现在有了它。这实际上是一个非常好的选择,但感觉有点黑客:)。一点也不黑客,整个绑定系统都依赖于这样的反射。此外,您可以在中找到一个类似但限制性更强的对象,因为它需要一个TargetObject
。啊,是的,没错。对于使用所有这些反射,我仍然有点担心,但实际上,如果没有它,所有绑定都无法完成。我将尝试一下这个片段。(OFC不只是C/P;))你可能也想考虑使用一些管转换器,因为这似乎组合两个分离的转换器,一个方法转换器和一个分数到刷转换器。我问了一个关于如何做到这一点的问题,大家对接受答案中的选项C很感兴趣,或者请看问题的草图。尽管这个问题不能解决我的问题,percee,但我认为这是最好的答案,因为它“解决”了我试图用XAML解决的潜在问题。
<vc:MyConverter x:Key="ScoreConverter"
TargetType="{x:Type local:MyStaticClass}"
MethodName="MyStaticMethod"/>