Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF难以绑定:使用静态方法的结果作为输入将值绑定到IConverter_C#_Wpf_Xaml_Data Binding_Converter - Fatal编程技术网

C# WPF难以绑定:使用静态方法的结果作为输入将值绑定到IConverter

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

我想知道是否有可能有以下类型的绑定,但我无法形成一个搜索查询来给出明确的答案,也无法在任何地方找到它

情况就是这样

我有一个带有“Items”(一个自定义类)的列表框,这些项目使用项目模板显示。我使用转换器来计算背景颜色。见下文:

<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"/>