WPF Bind Textbox IsEnabled для списка выбранных элементов - PullRequest
3 голосов
/ 15 декабря 2009

Используя стиль MVVM, я успешно связал ObservableCollection<string> с ListBox, показывая значения как RadioButton с. Управление ведет себя точно так, как ожидалось.

Теперь у меня есть проблема, связанная с некоторыми TextBox es, связанными с этим ListBox: я хочу, чтобы SelectedItem в ListBox было равно определенному значению (например, ValueForEnabled) TextBox es в противном случае они должны быть отключены.

Я знаю, что мне нужно привязаться к SeletedItem из ListBox (с именем lbSource), но как именно это делается?

Я хочу что-то вроде этого (псевдокод):

<TextBox  ...

    IsEnabled="{Binding ElementName=lbSource, Path=SelectedItem='ValueForEnabled',
                Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
                ...            
/>

Ответы [ 3 ]

6 голосов
/ 15 декабря 2009

OK! Решил это (по-другому) сам! Для тех, кто хочет знать:

<TextBox 
...
usual property definitions
...
                      >
                <TextBox.Style>
                    <Style>
                        <Setter Property="TextBox.IsEnabled" Value="False"/>
                        <Style.Triggers>                              
                            <DataTrigger Binding="{Binding ElementName=lbSource , Path=SelectedItem}" Value="ValueForEnabled">
                                <Setter  Property="TextBox.IsEnabled" Value="true"/>
                            </DataTrigger>                           
                        </Style.Triggers>                       
                    </Style>                   
                </TextBox.Style>
            </TextBox>
3 голосов
/ 18 декабря 2009

Лично я считаю, что если вы используете MVVM, то код должен оставаться в вашей ViewModel. так что если ваша виртуальная машина выглядит так:

public class MyViewModel
{
  public ObservableCollection<string> myColl {get;set;}
  public string SelectedString {get;set;}

  public bool IsEnabled
  {
     get { return SelectedString == "Desired string value";}
  }
}

Затем вы просто привязали бы свойство IsEnabled текстовых полей к свойству IsEnabled в вашей ViewModel

Причина, по которой я говорю, что ваши требования могут измениться относительно того, когда включать текстовые поля, и если вы делаете это таким образом, вам не нужно прикасаться к своему представлению (там, где не должно находиться кода / логики)

Итак, теперь вы делаете это по вашему мнению, и это все

<TextBox IsEnabled={Binding IsEnabled} Text={Binding SelectedString}/>

Надеюсь, я понимаю вашу проблему и что это помогает

2 голосов
/ 15 декабря 2009

Один из способов создать скин для этого кота - преобразовать строку (в списке) в логическое значение для передачи в IsEnabledProperty ...

Сначала создайте класс, который реализует интерфейс IValueConverter, например:

public class StringToBoolConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return false;

        string keyword = value.ToString();
        if (keyword.Equals(parameter.ToString(), StringComparison.CurrentCultureIgnoreCase))
            return true;
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Обратите внимание, как вам не нужно реализовывать метод ConvertBack? Это потому, что вам нужно только превратить строки в bools, а не наоборот ...

Таким образом, вы можете объявить экземпляр вашего конвертера в xaml, например

<Window
    ...
    xmlns:local="clr-namespace:WpfApplication1">

    <Window.Resources>
        <local:StringToBoolConverter x:Key="stringToBoolConverter" />
    </Window.Resources>

И, наконец, вы можете привязать TextBox к SelectedValue ListBox, например:

<TextBox Grid.Row="0" Width="90" Height="30" 
         IsEnabled="{Binding ElementName=lbSource, Path=SelectedValue, Converter={StaticResource stringToBoolConverter}, ConverterParameter=ValueForEnabled}">
</TextBox>

Примечание: это будет работать, только если ListBox содержит строки, и вы можете быть уверены, что свойство SelectedValue является строкой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...