代码之家  ›  专栏  ›  技术社区  ›  Robin

MVVM WPF-ItemsControl内的ComboBox双向绑定

  •  2
  • Robin  · 技术社区  · 9 年前

    我正在研究这个问题大约一天了。

    由于某种原因,如果值位于ItemsControl内,我无法TwoWay将其绑定到ComboBox。外面工作很好。

    我有一个int的ObservableCollection?在我的ViewModel中:

        private ObservableCollection<int?> _sorterExitsSettings = new ObservableCollection<int?>();
        public ObservableCollection<int?> SorterExitsSettings
        {
            get { return _sorterExitsSettings; }
            set
            {
                if (_sorterExitsSettings != value)
                {
                    _sorterExitsSettings = value;
                    RaisePropertyChanged("SorterExitsSettings");
                }
            }
        }
    

    我的XAML:

    <ItemsControl ItemsSource="{Binding SorterExitsSettings}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}, Path=DataContext.ScanRouter.Stores}"
                            SelectedValue="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="name" SelectedValuePath="id" IsEditable="True" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    

    因此ComboBox中填充了一个商店列表。到目前为止,它运行良好。 ObservableCollection SorterExitSettings甚至设置了一些值,这些值显示在显示的ComboBox中。因此,设置SelectedValue也有效。

    但是,当我更改选择时,排序器退出设置不会更改。而当我在没有ItemsControl的情况下实现ComboBoxes(100)时,它突然工作得很好。

    <ComboBox ItemsSource="{Binding ScanRouter.Stores}" DisplayMemberPath="name" SelectedValuePath="id" IsEditable="True" SelectedValue="{Binding SorterExitsSettings[0], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    

    当我使用ItemsControl和上面显示的示例ComboBox实现ComboBox时,效果更好。当我更改单个ComboBox的值时,它将更改ItemsControl中ComboBox值,但不会更改其他方式。

    以前有人遇到过这个问题吗?

    我的猜测是ItemsControl不喜欢我将所选值绑定到列表中的项这一事实。然而,当我直接绑定到ViewModel属性(Store)时,它也不起作用。 我还尝试使用SelctedItem代替SelectedValue,并用Store对象代替int?填充ObservableCollection?。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Mark Feldman    9 年前

    问题是,您将ComboBox的SelectedValue直接绑定到类型为 int ? 。这不起作用,绑定目标必须是属性。尝试包装您的 整数? 值,并使用getter和setter将该值作为该类的属性公开,例如:

    private ObservableCollection<Wrapper> _sorterExitsSettings = new ObservableCollection<Wrapper>();
    ... etc...
    

    以及:

    public class Wrapper
    {
        public int? Value {get; set;}
    }
    

    最后:

    <ComboBox ... SelectedValue="{Binding Path=Value, Mode=TwoWay...
    

    如果你还有问题,请发回这里。