【问题标题】:wpf combobox - bind custom isselected propertywpf 组合框 - 绑定自定义 isselected 属性
【发布时间】:2014-11-24 00:03:33
【问题描述】:

我想将具有“ID”、“描述”和“IsSelected”属性的项目列表绑定到组合框。使用 DisplayMemberPath 将显示值设置为“描述”,效果很好。但是,我希望在选择该项目时设置“IsSelected”属性。我尝试将 SelectedValuePath 和 SelectedValue 设置为“IsSelected”,但它不起作用。

【问题讨论】:

  • 项目被选中(不是它的 ID 或描述)。

标签: wpf combobox selectedvalue


【解决方案1】:

没有什么比重新回答一个五年前的问题...我不同意Mike,因为您应该跟踪这两种状态,因为 ComboBox 可以为您提供 SelectedValue 的 IsSelected 状态。 Matrix 位于正确的行上,但您不能将 IsSelected 与 DisplayMemberPath 一起使用。

通过下面的代码,我的 Fruits Selected 属性绑定到 IsSelected。

查看代码

<ComboBox ItemsSource="{Binding Fruit}"
          SelectedValue="{Binding SelectedFruitViewModel}" 
          DisplayMemberPath="Name">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="IsSelected" Value="{Binding Selected}" />
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

MainWindowViewModel

public class MainWindowViewModel : BaseViewModel
{
    private FruitViewModel _selectedFruitViewModel;

    public MainWindowViewModel()
    {
        this.Fruit = new ObservableCollection<FruitViewModel>
        {
            new FruitViewModel { Name = "Pineapple", Selected = false },
            new FruitViewModel { Name = "Apple", Selected = false },
            new FruitViewModel { Name = "Orange", Selected = false },
            new FruitViewModel { Name = "Kiwi", Selected = false }
        };
    }

    public ObservableCollection<FruitViewModel> Fruit { get; }

    public FruitViewModel SelectedFruitViewModel
    {
        get => _selectedFruitViewModel;
        set => SetProperty(ref _selectedFruitViewModel, value);
    }
}

FruitViewModel

public class FruitViewModel : BaseViewModel
{
    private bool _selected;
    private string _name;

    public bool Selected
    {
        get => _selected;
        set => SetProperty(ref _selected, value);
    }

    public string Name
    {
        get => _name;
        set => SetProperty(ref _name, value);
    }
}

BaseViewModel

public class BaseViewModel : INotifyPropertyChanged 
{
    public virtual event PropertyChangedEventHandler PropertyChanged;

    protected virtual bool SetProperty<T>(ref T storage, 
                                          T value, 
                                          [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(storage, value))
        {
            return false;
        }

        storage = value;

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        return true;
    } 
}

【讨论】:

    【解决方案2】:

    试试这个

        <ComboBox Width="120" Height="35">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <ComboBoxItem IsSelected="{Binding IsSelected}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    

    【讨论】:

      【解决方案3】:

      最简单的解决方案可能是跟踪视图模型中的选定项,并通过向SelectedItem 添加双向绑定来使其与ComboBox 同步。当视图模型属性发生变化时,更新新的和以前的选择的IsSelected 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多