WPF复选框IsEnabled绑定

时间:2017-07-11 11:00:20

标签: c# wpf xaml

我担心我有一个愚蠢的问题,我似乎无法找到答案。

我正在尝试为代码实现过滤器:它有一个可以输入标签的文本框,以及标签和未标记的复选框。我希望如果文本框中包含任何文本,Untagged将被禁用。

我认为这很容易:

我的ViewModel:

private bool _untaggedEnabled = true;
public UntaggedEnabled {
    get { 
        return _untaggedEnabled; 
    } set {
        _untaggedEnabled = value;
        OnPropertyChanged(nameof(UntaggedEnabled));
    } 
}

我的观点CodeBehind: (是的,我可以单独在xaml中执行此操作,但如果我擅长xaml,我就不会在这里!)

private void tagsList_TextChanged(object sender, TextChangedEventArgs e) {
    _viewModel.UntaggedEnabled = !string.IsNullOrWhiteSpace(tagsList.Text);
}

我的观点:

<TextBox x:Name="tagsList" Text="{Binding TagsList}" />
<CheckBox Content="Untagged" IsEnabled="{Binding UntaggedEnabled}" IsChecked="{Binding Untagged} />

组件中有许多其他控件和绑定属性,所有这些属性都正常工作,除了IsEnabled

我可以在整个地方调试输出,并且所有内容都会相应地更新,但实际上IsEnabled属性没有任何内容。

我还将Mode=TwoWayUpdateSourceTrigger=PropertyChanged添加到IsEnabled xaml,但无济于事。

我觉得这应该很容易。谁能看到我失踪的东西?

2 个答案:

答案 0 :(得分:2)

这个ViewModel绑定没有问题(并摆脱视图代码隐藏)

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged( [CallerMemberName] string propertyName = null )
    {
        PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
    }

    protected bool Set<T>( ref T storage, T value, [CallerMemberName] string propertyName = null )
    {
        if ( Equals( storage, value ) ) return false;

        storage = value;
        OnPropertyChanged( propertyName );
        return true;
    }

    string _tags;
    bool _untagged;

    public string Tags
    {
        get => _tags; set
        {
            if ( Set( ref _tags, value ) )
            {
                OnPropertyChanged( nameof( UntaggedEnabled ) );
            }
        }
    }
    public bool Untagged { get => _untagged; set => Set( ref _untagged, value ); }
    public bool UntaggedEnabled => string.IsNullOrWhiteSpace( Tags );
}

查看:

<TextBox 
    Text="{Binding Tags,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<CheckBox 
    Content="Untagged" 
    IsChecked="{Binding Untagged, Mode=TwoWay}" 
    IsEnabled="{Binding UntaggedEnabled, Mode=OneWay}"/>

答案 1 :(得分:0)

  

如果文本框中包含任何文本,则会禁用未标记

这可以在视图中没有任何代码的情况下轻松实现:

<TextBox Text="{Binding TagsList, UpdateSourceTrigger=PropertyChanged}" />
<CheckBox Content="Untagged" IsEnabled="{Binding IsUntaggedEnabled}"/>

但是在ViewModel中有一些:

string _tagList;
public string TagList
{
    get { return _tagList; }
    set
    {
        _tagList = value;
        OnPropertyChanged(); // [CallerMemberName]
        OnPropertyChanged(nameof(IsUntaggedEnabled));
    }
}

public bool IsUntaggedEnabled => TagList != "";