WPF Data Binding: включить / отключить элемент управления на основе содержимого var? - PullRequest
12 голосов
/ 26 июня 2009

У меня есть кнопка в форме, которая должна быть включена только тогда, когда элемент выбран в древовидном представлении (или в виде списка в табеме) Когда элемент выбран, его значение сохраняется в строковой переменной-члене.

Можно ли связать свойство IsEnabled кнопки с содержимым элемента var? То есть, если элемент var не пустой, включите кнопку.

Аналогично, когда изменяется содержимое элемента var (установлено или очищено), состояние кнопки должно измениться.

Ответы [ 3 ]

12 голосов
/ 26 июня 2009

Поскольку вы, вероятно, хотите связать свойство IsEnabled кнопки на основе строки, попробуйте создать для нее конвертер.

То есть ...


<StackPanel>
<StackPanel.Resources>
<local:SomeStringConverter mystringtoboolconverter />
</StackPanel.Resources>
<Button IsEnabled="{Binding ElementName=mytree, Path=SelectedItem.Header, Converter={StaticResource mystringtoboolconverter}}" />
<StackPanel>

и конвертер:


[ValueConversion(typeof(string), typeof(bool))]
    class SomeStringConverter : IValueConverter {
        public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
            string myheader = (string)value;
            if(myhead == "something"){
                return true;
            } else {
                return false;
            }
        }

        public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) {
            return null;
        }
    }

EDIT: Так как ОП хотел связать с переменной, нужно сделать что-то вроде этого:


public class SomeClass : INotifyPropertyChanged {
  private string _somestring;

  public string SomeString{
    get{return _somestring;}
    set{ _somestring = value; OnPropertyChanged("SomeString");}
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

}

Затем измените вышеприведенное выражение привязки на:

{Binding Path=SomeString, Converter={StaticResource mystringtoboolconverter}}

Обратите внимание, вы ДОЛЖНЫ внедрить INotifyPropertyChanged для обновления своего пользовательского интерфейса.

7 голосов
/ 26 июня 2009

У вас есть ViewModel, хранящий ваше строковое свойство, установленное как DataContext представления, где вы пытаетесь сделать это связывание?

Тогда будет работать следующее:

  // Example ViewModel
public class MyClass : INotifyPropertyChanged
{
    private string text;

    public string Text
    {
        get { return text; }
        set 
        { 
            text = value;
            UpdateProperty("Text");
            UpdateProperty("HasContent");
        }
    }

    public bool HasContent
    {
        get { return !string.IsNullOrEmpty(text); }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void UpdateProperty(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

Тогда вы должны были сделать что-то подобное в коде за представлением:

this.DataContext = new MyClass();

И пример Xaml:

 <StackPanel>
        <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
        <Button IsEnabled="{Binding HasContent}">
            Click Me!
        </Button>
    </StackPanel>
0 голосов
/ 24 мая 2019

Это не точно , отвечающий на вопрос, и да, это десятилетний, но ... Я наткнулся на этот очень полезный трюк, любезно предоставленный https://www.codeproject.com/Tips/215457/How-to-make-Button-Enable-Disable-depends-on-a-Tex.

<Button Content="Add Name " Width="100" Height="30" 
    IsEnabled="{Binding ElementName=txtName, Path=Text.Length, Mode=OneWay}">
</Button>

Теперь доступность кнопки зависит от заполненности элемента с именем "txtName".

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