【问题标题】:ComboBox SelectedItem not getting set when using custom ItemTemplate使用自定义 ItemTemplate 时未设置 ComboBox SelectedItem
【发布时间】:2018-08-06 23:47:22
【问题描述】:

我有一个带有自定义 ItemTemplate 的 ComboBox,它有一个绑定到该页面的 ViewModel 的 CheckBox。

我要做的是在 ComboBox 关闭时将选中的 ComboBox 项目设置为第一个选中的值,但该值没有得到相应的设置。

我有什么遗漏的吗?

Xaml:

<ComboBox x:Name="myComboBox" ItemsSource="{Binding ComboBoxList}" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}" HorizontalAlignment="Center" VerticalAlignment="Center" Height="50" Width="150">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding}" Margin="0" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <interactivity:Interaction.Behaviors>
                <core:DataTriggerBehavior Binding="{Binding IsDropDownOpen, ElementName=myComboBox}" ComparisonCondition="NotEqual" Value="True">
                    <core:InvokeCommandAction Command="{Binding DropDownClosedCommand}"/>
                </core:DataTriggerBehavior>
            </interactivity:Interaction.Behaviors>
</ComboBox>

视图模型:

 public class MainViewModel : INotifyPropertyChanged
{
    private string header;

    public string Header
    {
        get { return header; }
        set
        {
            header = value;
            RaisePropertyChange(nameof(Header));
        }
    }

    private Person selectedPerson;

    public Person SelectedPerson
    {
        get { return selectedPerson; }
        set { selectedPerson = value; RaisePropertyChange(nameof(SelectedPerson)); }
    }


    private ObservableCollection<Person> comboBoxList;

    public ObservableCollection<Person> ComboBoxList
    {
        get { return comboBoxList; }
        set { comboBoxList = value; }
    }


    public DelegateCommand DropDownClosedCommand { get; set; }

    public MainViewModel()
    {
        Header = "My Header";

        ComboBoxList = new ObservableCollection<Person> {
             new Person() { Name = "Person 1", IsChecked = false },
                  new Person() { Name = "Person 2", IsChecked = false },
                  new Person() { Name = "Person 3", IsChecked = false },
                  new Person() { Name = "Person 4", IsChecked = false }
        };

        DropDownClosedCommand = new DelegateCommand(OnDropDownClosed);

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChange(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private void OnDropDownClosed(object e)
    {
        SelectedPerson = ComboBoxList.FirstOrDefault(x => x.IsChecked);
    }
}

public class Person
{
    public string Name { get; set; }

    public bool IsChecked { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

【问题讨论】:

    标签: c# xaml uwp


    【解决方案1】:

    最后,我发现了阻止 ComboBox 设置 SelectedItem 的问题。这是因为 SelectedPerson 没有在 UI 线程上设置,所以我将该代码包装在调度程序中并且它按预期工作。

    代码:

    CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () =>
    {
       SelectedPerson = ComboBoxList.FirstOrDefault(x => x.IsChecked);
    });
    

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多