我可以将UpdateSourceTrigger = PropertyChanged绑定到与绑定属性不同的属性吗?

时间:2018-12-14 00:39:14

标签: c# wpf xaml

假设我要绑定到控件的可见性:

Visibility="{Binding Path=Name, Converter={StaticResource NameToVisibilityConverter}}"

这样,它在应用程序首次启动时效果很好,但是当NameToVisibilityConverter中的某个参数发生更改导致可见性有所不同时,但可见性却绑定到了Name保持不变,不会重新触发转换器。我可以尝试一下:

Visibility="{Binding Path=Name, Converter={StaticResource NameToVisibilityConverter}, UpdateSourceTrigger=PropertyChanged}"

添加UpdateSourceTrigger=PropertyChanged对这种情况没有帮助,因为Binding Path=.相同,并且不会触发valueconverter再次转换。

如何更改UpdateSourceTrigger=PropertyChanged的属性,使其在与Name不同的属性上触发(我想要实现的属性类似于与当前绑定不同的UpdateSourceProperty属性) :

Visibility="{Binding Path=Name, Converter={StaticResource NameToVisibilityConverter}, UpdateSourceTrigger=PropertyChanged, UpdateSourceProperty={Binding Path=Count}"

谢谢!请让我知道是否需要澄清。最重要的是,我需要一个valueConverter来进行转换,而不是更改绑定属性的频率。

2 个答案:

答案 0 :(得分:1)

  

如何更改U pdateSourceTrigger=PropertyChanged的属性,使其在不同于Name的属性上触发(我想要实现的属性类似于与当前绑定不同的UpdateSourceProperty属性):

仅当数据绑定属性更改时,才调用转换器。更改UpdateSourceTrigger的值不会更改任何内容。

您可以做的是使用MultiBinding和一个多值转换器将多个属性绑定,例如:

<SomeControl.Visibility>
    <MultiBinding Converter="{StaticResource NameToVisibilityConverter}">
        <Binding Path="Name" />
        <Binding Path="SomeOtherPropertyThatShouldTriggerTheConverter" />
    </MultiBinding>
</SomeControl.Visibility>

然后,您的转换器类应实现IMultiValueConverter接口,而不是IValueConverter接口。

答案 1 :(得分:0)

首先,UpdateSourceTrigger与您所需的效果无关。当您在窗口中更改属性时,它用于更新源(在您的情况下为Name)。如果要在更改源时更改属性,则应首先在模型类中实现INotifyPropertyChanged接口。

class Model
{
    private string name;

    public string Name
    {
        get=>name;
        set
        {
            name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string prop = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
    }
}

然后,如果将Name属性绑定到窗口中的某些控件属性,则每次设置此属性时,它将触发PropertyChanded属性的Name事件,并且绑定将被更新。 / p>

如果属性取决于模型中的几个属性,并且在更改任何模型属性时都应更新,则最合乎逻辑的方法是将MultiBindingIMultiValueConverter一起使用。但是,如果由于某种原因您不想要或不能做到,您可以开枪

OnPropertyChanged(nameof(Name))

每次您不仅更改名称,还更改控件所依赖的其他属性。然后绑定将更新,就好像您更改了名称一样。