1

我有一个带有一些多重绑定的按钮,它附加了一个命令:

<Button Content="remove" HorizontalAlignment="Right" VerticalAlignment="Top" Cursor="Hand" Focusable="False">
  <Button.Command>
      <Binding  Path="DataContext.DeleteColumnCommand"  ElementName="treeView" />
  </Button.Command>
  <Button.CommandParameter>
      <MultiBinding  Converter="{StaticResource midConverter}">
              <Binding Path="Text"  ElementName="tableName"/>
              <Binding Path="Name" />
      </MultiBinding>
  </Button.CommandParameter>
</Button>

我看到当我在转换器中放置一个断点时,每个值都被设置并且看起来它正在工作。

但是,当实际调用该命令时,我收到一个填充了 null 的数组作为参数 !

我想 WPF 重用并改变了我在转换器中看到的数组,这并不无意义,因为这是我没有分配的引用类型,并且在 WPF 的上下文中最大性能是非常需要的。

我的问题是:什么最能概括 WPF 中围绕突变的指导/保证?

有这方面的规则吗?

PS:我在这里看到其他人有同样的问题,显然不明白起源。

PPS:我的问题可能不够清楚,但很自然地,必须在堆上分配一个新的结构、列表、数组等,因为你得到的那个可能会被重用。问题是:从这个特别的例子来看,在这种情况下 WPF 的规则是什么?

4

1 回答 1

0

是一个类似问题的答案

你可以使用多重绑定和转换器

<Button Content="Add" Command="{Binding AddCommand}"
 <Button.CommandParameter>
    <MultiBinding Converter="{StaticResource YourConverter}">
         <Binding Path="Text" ElementName="txt1"/>
         <Binding Path="Text" ElementName="txt2"/>
    </MultiBinding>
 </Button.CommandParameter>
</Button>

转换器:创建一个新数组很重要!

public class YourConverter : IMultiValueConverter
{
 public object Convert(object[] values, ...)
 {
    //.Net > 4.0
    return new Tuple<int, int>((int)values[0], (int)values[1]); //<-- this is important

    //or .Net < 4.0
    //return values.ToArray();//<-- this is important
 }

 ...
}

命令

private void  CommandExecute(object parameter)
{
    var o= (Tuple<int, int>)parameter;
    var a= o.Item1;
    var b= o.Item2;
    Calculater calcu = new Calcu();
    int c = calcu.sum(a, b);      
}

ps:请检查我的语法 - 它是从我的脑海中写出来的......

于 2013-04-05T05:47:29.220 回答