2013-04-04 3 views
1

У меня есть кнопка с некоторой MultiBinding, к которому присоединена команде:MultiBinding и мутация в WPF

<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> 

Я вижу, что, когда я ставлю точку останова в преобразователе, каждое значение устанавливается и выглядит как он работает.

Однако, когда на самом деле вызывается команда, я получаю в качестве аргумента массив, заполненный нулями!

Я предполагаю, что WPF повторно использует и изменяет массив, который я видел в моем конверторе, который не делает глупостей, поскольку это ссылочный тип, который я не выделил, и в контексте максимальной производительности WPF очень необходим.

Мой вопрос: что лучше всего обобщает руководство/гарантии вокруг мутации, подобные тому, что есть в WPF?

Есть ли правило вокруг этого?

PS: Я вижу here, что другие люди имели одинаковую проблему и, по-видимому, не понимали происхождение.

PPS: Я не делал свой вопрос достаточно ясным, но естественно, что нужно выделять новую структуру, список, массив, что угодно, в кучу, поскольку тот, который вы получаете, может быть повторно использован. Вопрос: из этого ad-hoc примера, каковы правила WPF в таких случаях?

+0

показать ваш конвертер код – blindmeis

+0

Я не хочу говорить о преобразователе, а о мутации. сам преобразователь тривиален. – nicolas

ответ

0

here является ответ на аналогичный вопрос

вы можете использовать MultiBinding и конвертер

<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);  
} 

пс: Пожалуйста, проверьте мой синтаксис - его написал от моего ума ...

+0

действительно, создавая новую распределенную структуру, естественно следует из того, что я выставил. мой вопрос: когда мы можем безопасно повторно использовать данные, данные WPf? Я думаю, каждый раз, когда мы получаем ссылочный тип, который мы должны копировать .... за исключением объекта value? – nicolas