【问题标题】:CommandParameter MultiBinding returns array with null elements [closed]CommandParameter MultiBinding 返回具有空元素的数组 [关闭]
【发布时间】:2020-11-02 01:09:50
【问题描述】:
<Button Margin="222,256,130,19" Content="Add" Command="{Binding AddCustomer}">
   <Button.CommandParameter>
      <MultiBinding Converter="{StaticResource MyMultiConverter}">
         <Binding ElementName="Name" Path="Text"></Binding>
         <Binding ElementName="ID" Path="Text"></Binding>
      </MultiBinding>
   </Button.CommandParameter>
</Button>
public class MultiConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
   {
      return values;
   }

   // ...
}

我已经在我的类中实现了 IMultiValueConverter 接口并实现了方法 Convert,但是

当我的按钮命令执行“AddCustomer”方法时,它会导致命令参数以 object[] { null, null } 结尾。

我没有找到解释为什么我必须放 return values.Clone(); 来解决这个问题

【问题讨论】:

  • 关于绑定的良好信息来源是您的输出窗口,如果您的绑定有效,请查看那里以获取更多信息,您也可以使用PresentationTraceSources.TraceLevel=High 获得更准确的信息,这些信息将显示在输出窗口中。

标签: c# wpf mvvm data-binding


【解决方案1】:

绑定返回 null(正如您在我编辑之前声称的标题)还是返回一个二元素数组 { null, null }(如您的帖子声称的那样)?前者似乎不太可能。如果个别绑定不正确,则可能发生后者。

但是,会发生的另一件事是,如果您实际上返回的是 values 数组,那不是您拥有的数组,也不是您可以依赖的数组。作为优化,WPF 每次调用转换器时都会复用同一个数组,并且在转换器返回后,数组的元素会被清空。

克隆阵列解决问题与此行为一致。答案很简单:不要尝试使用那个数组;这不是你的。如果您想要逐字记录所有值,则必须复制到一个新数组中,就像您现在所做的那样。

【讨论】:

  • stackoverflow.com/questions/10759523/… 。它返回一个两元素数组作为空值。这个帖子有同样的问题,他们简要解释了,但我不明白为什么我必须复制它。每次绑定值更改时都会运行 Convert 方法。调用 Convert 方法时数组的值在那里,但在我执行命令时不存在。之后是否清除数组..我执行命令?为什么要清除数组?它不应该先返回值吗?
  • “之后是否清除数组” -- 是的。 “它不应该先返回值吗?” -- 它确实返回了值......当调用转换器时它们就在那里。如果您想保留它们,那是您复制值的机会。许多转换器将这些值组合成一些新的计算值......是否复制取决于这些值的使用方式,但在您的情况下,您(显然)希望保留传递给转换器的原始值,所以这取决于您将它们复制到安全的地方(例如数组的克隆)。
  • 所以.. 如果我理解正确的话,每次在文本框中更改值时都会调用转换器,我们说的是return values;。但是它将值返回到哪里?到 CommandParameter 属性?在那种情况下,即使它清除了数组并且我们执行了命令,它是否仍保留在该属性中?还是它被保留了,但由于我们正在清除数组,并且这是一个引用类型,CommandParameter 内部的值也消失了,这就是我们必须复制它们的原因?
  • 转换器的Convert() 方法在多绑定更改的任何源绑定中随时调用。这些源绑定提供的值作为values 数组中的值传递。然后,您的转换器的任务是将这些值转换 为有用的值,然后返回 该值。您正在返回对原始 values 数组的引用,这就是转换器在多重绑定中提供的值,因此是传递给您的命令的值。但这只是一个参考。当 reference 传递给命令时,... 中的 values
  • ... 数组已更改为空值。请务必记住,您的转换器返回的值是一个对象的 reference,因此在转换器返回后对该对象所做的任何修改,仍然会被以后使用该 _reference 的任何代码看到.您可能想阅读诸如stackoverflow.com/questions/5057267/…stackoverflow.com/questions/1938301/reference-types-in-depth 之类的问题
猜你喜欢
  • 2012-11-22
  • 2020-01-24
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2017-06-19
相关资源
最近更新 更多