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# 使用MethodToValueConverter时更新数据绑定_C#_Wpf_Xaml_Mvvm_Data Binding - Fatal编程技术网

C# 使用MethodToValueConverter时更新数据绑定

C# 使用MethodToValueConverter时更新数据绑定,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我有一个使用MethodToValueConverter作为答案的数据绑定。这非常有效,但是在方法的结果更改后,我很难强制更新视图。这有点难以解释,所以希望一些代码剪贴会有所帮助 类对象 [DataContract] public class RetentionBankItem : INotifyPropertyChanged { #region Private Properties public event PropertyChangedEventHandler Propert

我有一个使用
MethodToValueConverter
作为答案的数据绑定。这非常有效,但是在方法的结果更改后,我很难强制更新视图。这有点难以解释,所以希望一些代码剪贴会有所帮助

类对象

[DataContract]
public class RetentionBankItem : INotifyPropertyChanged
{
    #region Private Properties
    public event PropertyChangedEventHandler PropertyChanged;
    private float _rbRevisedRateLoad;
    private float _rbCurrentRateLoad;
    #endregion

    [DataMember]
    public float rbRevisedRateLoad
    {
        get
        {
            return _rbRevisedRateLoad;
        }
        set
        {
            PropertyChanged.ChangeAndNotify(ref _rbRevisedRateLoad, value, () => rbRevisedRateLoad);
            OnPropertyChanged("RateLoadDifference");
        }
    }

    [DataMember]
    public float rbCurrentRateLoad
    {
        get
        {
            return _rbCurrentRateLoad;
        }
        set
        {
            PropertyChanged.ChangeAndNotify(ref _rbCurrentRateLoad, value, () => rbCurrentRateLoad);
            OnPropertyChanged("RateLoadDifference");
        }
    }

    public float RateLoadDifference()
    {
        if (rbCurrentRateLoad != 0)
        {
            return rbRevisedRateLoad / rbCurrentRateLoad;
        }
        return 0;
    }
}
应注意,在以下代码中,
RetentionBank
属于
List

我的装订看起来像这样:

<ItemsControl ItemsSource="{Binding RetentionBank}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding rbRevisedRateLoad, Mode=TwoWay}"
                     Grid.Row="2"
                     Grid.Column="0" />

            <TextBox Text="{Binding rbCurrentRateLoad, Mode=TwoWay}"
                     Grid.Row="2"
                     Grid.Column="1" />

            <TextBox Text="{Binding Path=., Converter={StaticResource ConverterMethodToValue}, ConverterParameter='RateLoadDifference', Mode=OneWay}"
                     Grid.Row="2"
                     Grid.Column="2" />
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>


当前和修改后的速率负载设置正确,但设置之后,永远不会调用RateLoadDifference进行更新。我认为类对象本身需要被调用来更新,因为这是textbox实际绑定的对象(不一定是方法本身),但我不确定如何做到这一点,或者这是否是正确的方式。如有任何帮助或建议,将不胜感激。谢谢

将RateLoadDifference更改为属性:

public float RateLoadDifference
{
    get
    {
        if (rbCurrentRateLoad != 0)
        {
            return rbRevisedRateLoad / rbCurrentRateLoad;
        }

        return 0;
    }
}
然后将绑定更改为

Binding="{Binding Path=RateLoadDifference, Mode=OneWay}"

什么是PropertyChanged.ChangeAndNotify?它本质上是一种更干净(不使用字符串,代码更友好)的调用方式。我从它是否正常工作中得到了这段代码-\rbCurrentRateLoad=value;OnPropertyChanged()?很遗憾,不是。设置当前和修订的速率加载属性没有问题,但是在设置它们之后,视图没有使用
RateLoadDifference
的最新结果进行更新。您可能需要RateLoadDifference的getter吗?虽然这是一个选项,但我尽量避免以这种方式使用属性。不幸的是,它并不完全符合文章中提到的一个类别。在这个特殊的例子中,我会说财产不会造成太大的伤害,但在其他一些例子中,我可能会遇到同样的问题,我绝对不想把它放在财产中。这就是为什么我在这里,看看我是否有点狭隘,或者是否有一种不使用财产的方法。我们拭目以待!我认为ViewModel功能有时可能是主观的。我编写代码的方式是将ViewModel视为针对特定视图需求操纵模型数据。因为视图需要RateLoadDifference,所以在这种情况下我没有发现问题。@jmgardn2的另一种方式是什么?一般来说,编写比仅仅遵循一个想法所需的代码更多的代码的想法是一种代码气味-转换器是昂贵的,在这种情况下可以避免,因此这是一种代码气味。更不用说转换器中存在一定的性能损失,最终应该是一种非常简单的绑定。