Связывание данных WPF: включить/отключить элемент управления на основе содержимого var?

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

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

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

Ответ 1

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

Ie...


<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: Поскольку OP хотел связать с переменной, нужно сделать что-то подобное:


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 для обновления вашего интерфейса.

Ответ 2

У вас есть 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>

Ответ 3

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

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

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