【问题标题】:WPF Binding - Notify Change to ToString valueWPF 绑定 - 通知对 ToString 值的更改
【发布时间】:2019-09-24 22:47:23
【问题描述】:

我有一个绑定到对象的文本块。这个对象我已经重写了 ToString 以返回 2 个其他属性的组合。当其中一个属性值更新时,如何通知 ToString 值已更改?

很遗憾,我无法将绑定更改为 ToString 值,因为这是在第 3 方控件内,因此确实需要能够直接通知。

希望下面的类定义能阐明我的意思:

public class Person : INotifyPropertyChanged
{
  private string firstname;
  public string Firstname
  {
    get { return firstname; }
    set
    {
      firstname = value;
      OnPropertyChanged("Firstname");
    }
  }

  private string surname;
  public string Surname
  {
    get { return surname; }
    set
    {
      surname = value;
      OnPropertyChanged("Surname");
    }
  }

  public override string ToString()
  {
    return string.Format("{0}, {1}", surname, firstname);
  }
}

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    我假设当您说控件“绑定”到 ToString() 时,您的对象被用作 ContentControl 上的 ContentControl 某处不可访问的代码,默认情况下会创建一个显示 ToString 值的 TextBlock(如果您不是确保您可以通过 Snoop 找到答案)。如果您在控件的资源中为您的 Person 类型创建一个全局类型化 DataTemplate,您可以使用它来显示不同的属性,例如新的 FullName 属性:

    <ThirdPartyControl.Resources>
      <DataTemplate DataType="{x:Type data:Person}">
        <TextBlock Text="{Binding FullName}"/>
      </DataTemplate>
    </ThirdPartyControl.Resources>
    

    【讨论】:

      【解决方案2】:

      如果您不想为全名添加专门的属性,您应该能够在绑定中使用 StringFormat。请参阅此 blog post 中的 MultiBinding 示例。 [需要 .NET 3.5 SP1]

      【讨论】:

        【解决方案3】:

        您可以添加第三个只读属性,它返回ToString(),并使用该属性的名称调用OnPropertyChanged

        【讨论】:

          【解决方案4】:

          当一个或多个属性发生变化时,您可以使用多重绑定(无需转换器)调用 ToString() 方法。

          <StackPanel>
            <TextBlock>
              <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}">
                  <Binding Path="" />
                  <Binding Path="Firstname" />
                  <Binding Path="Surname" />
                </MultiBinding>
              </TextBlock.Text>
            </TextBlock>
          </StackPanel>
          

          【讨论】:

            【解决方案5】:

            不要绑定到ToString()。而是在其他两个属性设置器中引入 FullName 属性并引发 OnPropertyChanged("FullName")

            【讨论】:

            • 这是有道理的,除非(我确实在我现在将编辑的原始帖子中忽略了这个细节)ToString 值的绑定在我无法更改的第 3 方控件内跨度>
            猜你喜欢
            • 1970-01-01
            • 2010-11-28
            • 1970-01-01
            • 1970-01-01
            • 2010-11-23
            • 1970-01-01
            • 2011-02-20
            • 2013-08-16
            • 1970-01-01
            相关资源
            最近更新 更多