выборочный конвертер привязки двойной команды в WPF? - PullRequest
1 голос
/ 14 мая 2010

Я начну и скажу, что я не использую шаблон MVVM для своего приложения WPF. Пожалуйста, прости меня.

Прямо сейчас у меня есть шаблон данных с двумя кнопками, каждая из которых связана с отдельной командой объекта CLR, который представляет этот шаблон данных. Оба используют один и тот же параметр команды. Вот пример кнопок.

<Button x:Name="Button1"
        Command="{Binding Path=Command1}"
        CommandParameter="{Binding Path=Text, ElementName=TextBox1}"
/>
<Button x:Name="Button2"
        Command="{Binding Path=Command2}"
        CommandParameter="{Binding Path=Text, ElementName=TextBox1}"
/>

Я хотел бы преобразовать это в одну кнопку, которая может выполнять любую команду, основываясь на пользовательских настройках, таких как логическое значение в Settings.settings. У меня нет доступа к рефакторингу самого объекта CLR. Также это шаблон данных, с которым я не работаю. Я считаю, что конвертер был бы лучшим выбором, но я не знаю, как бы это сложить.

Конвертер должен принимать CommandParameter, а также DataContext, чтобы он знал, на каком объекте выполнять Команды.

Может ли кто-нибудь помочь мне с этим? Заранее спасибо.

1 Ответ

4 голосов
/ 14 мая 2010

Быстрое и грязное решение - поместите обе кнопки в форму и свяжите их видимость со значением bool (очевидно, одна отрицательная) - так будет показана только действительная кнопка.

Однако если вы хотите использовать конвертер, я склонен использовать его при связывании команд, передать объект CLR и значение bool и разрешить ему возвращать правильную команду для привязки. Я не вижу причин для передачи параметра команды, поскольку в любом случае это будет то же самое.

XAML:

<Resources>
  <controls:CommandConverter x:Key="CommandConverter"/>
</Resources>

<Button x:Name="Button" 
        CommandParameter="{Binding Path=Text, ElementName=TextBox1}">
    <Button.Command>
        <MultiBinding Converter="{StaticResource CommandConverter}">
          <MultiBinding.Bindings>
            <Binding /><-- the datacontext CLR object -->
            <Binding ... /><-- Application setting (however you intend to get that in)
          </MultiBinding.Bindings>
        </MultiBinding>
    </Button.Command>
</Button>

Код:

public class CommandConverter : IMultiValueConverter
{        
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        CommandObject clrObject= (CommandObject)values[0]; 
        bool setting = (bool)values[1];

        if (setting)
        {
            return clrObject.Command1;
        }

        return clrObject.Command2;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

На самом деле, если параметр bool находится только в настройках приложения, вы могли бы просто использовать его непосредственно в преобразователе и использовать только обычный преобразователь с одним значением. Не очень хороший дизайн, потому что он действительно должен стоять в одиночестве, но он справится с работой.

...