WPF使组合框绑定两倍

时间:2018-03-14 19:54:55

标签: wpf xaml combobox binding

我有一个可编辑的组合框,我有一个按钮,当绑定到组合框的SelectedReplacement不为空时启用,并且当它被禁用时启用。当它为null时,我会输入一些随机文本来启用按钮,问题是当我输入文本时它不会启用。使模式TwoWay没有帮助。我假设设置propertychangedevent会将新文本绑定到SelectedReplacement,但我错了,所以感谢任何帮助。

<ComboBox ItemsSource="{Binding SelectedError.Suggestions}"
                      Text="{m:Binding Path=SelectedError.SelectedReplacement, Mode=TwoWay}"
                      IsEditable="True"
                      HorizontalAlignment="Stretch"/>

我也试图获得propertychanged

    private void ViewModelPropertyChanged(SpellcheckViewModel sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(sender.SelectedError.SelectedReplacement))
        {
            _correctCommand?.Refresh();
        }
    }

1 个答案:

答案 0 :(得分:0)

我尝试编写一个演示项目来满足您的要求。

主要是,启用状态由视图模型中的另一个布尔属性IsButtonEnabled控制,该属性的值由InputText属性控制,该属性由您在ComboBox控件中输入的文本控制。

以下是用户界面:

<StackPanel Margin="10">
    <ComboBox
        x:Name="cmb"
        IsEditable="True"
        ItemsSource="{Binding AllItems}"
        TextBoxBase.TextChanged="cmb_TextChanged"
        TextSearch.TextPath="Name">

        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    <TextBox
        x:Name="hiddenTextBox"
        Text="{Binding InputText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
        Visibility="Collapsed" />
    <Button
        x:Name="btn"
        Margin="0,10,0,0"
        Content="Show message"
        IsEnabled="{Binding IsButtonEnabled}" />
</StackPanel>

这是视图模型中的主要逻辑:

    public ObservableCollection<Item> AllItems
    {
        get { return _allItems; }
        set { _allItems = value; this.RaisePropertyChanged("AllItems"); }
    }

    public bool IsButtonEnabled
    {
        get { return _isButtonEnabled; }
        set { _isButtonEnabled = value; this.RaisePropertyChanged("IsButtonEnabled"); }
    }

    /// <summary>
    /// When InputValue changed, change the enable state of the button based on the current conditions
    /// </summary>
    public string InputText
    {
        get { return _inputText; }
        set
        {
            _inputText = value;
            this.RaisePropertyChanged("InputText");

            // You can control the enable state of the button easily
            if (AllItems.Any(item => item.Name == value))
            {
                // SelectedItem is not null
                IsButtonEnabled = true;
            }
            else if (!string.IsNullOrEmpty(value))
            {
                // SelectedItem is null
                IsButtonEnabled = true;
            }
            else
            {
                IsButtonEnabled = false;
            }
        }
    }

最后,这是项目:ComboBoxDemo