Вопрос по c#, wpf – Привязка данных WPF: включить / отключить элемент управления на основе содержимого var?

11

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

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

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

Ваш Ответ

2   ответа
7

хранящий ваше строковое свойство, установленное как 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>
Error: User Rate Limit Exceeded Number8
Error: User Rate Limit Exceeded Number8
Error: User Rate Limit Exceeded
11

вероятно, хотите связать свойство 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;
        }
    }

РЕДАКТИРОВАТЬ: Поскольку ОП хотел связать с переменной, нужно сделать что-то вроде этого:


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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Number8
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Number8
Error: User Rate Limit Exceeded Number8

Похожие вопросы