【问题标题】:Can I Bind the UpdateSourceTrigger=PropertyChanged to a Different Property than the Bound Property?我可以将 UpdateSourceTrigger=PropertyChanged 绑定到与绑定属性不同的属性吗?
【发布时间】:2018-12-14 00:39:14
【问题描述】:

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

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 来转换比绑定属性更改频​​率更高的频率。

【问题讨论】:

  • 我认为该事件的目的是满足数据源更改,并且您想要刷新绑定(在设计时定义)。
  • 你应该使用 MultiBinding 来代替

标签: c# wpf xaml


【解决方案1】:

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

转换器仅在 data-bound 属性更改时调用。更改 UpdateSourceTrigger 的值不会改变任何内容。

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

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

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

【讨论】:

  • 谢谢。这是我从未想过的MultiBinding 的一个非常独特的用例!可以确认它在我的情况下运行良好。
【解决方案2】:

首先,UpdateSourceTrigger 与你需要的效果无关。它用于在窗口中更改属性时更新源(在您的情况下为名称)。如果您希望在更改源时更改属性,首先应在模型类中实现 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 属性绑定到窗口中的某个控件属性,则每次设置此属性时,它都会为 Name 属性触发 PropertyChanded 事件,并且绑定将被更新。

如果属性依赖于模型中的多个属性并且应该在任何模型属性更改时更新,最合乎逻辑的方法是使用MultiBindingIMultiValueConverter。但是如果由于某种原因你不想或不能这样做,你可以开火

OnPropertyChanged(nameof(Name))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2012-12-11
    • 2016-04-30
    • 2010-09-08
    • 2012-07-23
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多