WPF ComboBox, не обновляющий источник

У меня было несколько проектов в решении, и веб-проект (проблема с этой ошибкой) не был задан как проект StartUp. Я установил этот веб-проект как проект StartUp и нажал на пункт меню «Debug» -> «Начать отладку», и он сработал. Я остановил отладку, а затем снова попробовал, и теперь он снова работает. Weird.

15
задан Ken Smith 2 March 2009 в 23:40
поделиться

1 ответ

Я смог получить эту работу. Но я установил вещи крошечный бит по-другому.

  1. я создал ViewModel для действия как контракт с Представлением.
  2. я связал с ComboBox. Свойство SelectedItem вместо ComboBox. Свойство

SelectedValue, Так как я не знал то, чем был Ваш источник данных, я составил свое собственное для моделирования основной проблемы: наличие поля комбинированного списка связывает правильно в WPF DataGrid.

Вот состав моей Модели Представления:

public class RootViewModel
{
    public List<State> USStates { get; set; }
    public List<Customer> Customers { get; set; }

    public ViewModel()
    {
        Customers = new List<Customer>();
        Customers.Add(new Customer() { FirstName = "John", LastName = "Smith", State = new State() { ShortName = "IL" } });
        Customers.Add(new Customer() { FirstName = "John", LastName = "Doe", State = new State() { ShortName = "OH" } });
        Customers.Add(new Customer() { FirstName = "Sally", LastName = "Smith", State = new State() { ShortName = "IN" } });

        USStates = new List<State>();
        USStates.Add(new State() { ShortName = "OH" });
        USStates.Add(new State() { ShortName = "IL" });
        USStates.Add(new State() { ShortName = "IN" });
    }
}

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public State State { get; set; }
}

public class State
{
    public string ShortName { get; set; }

    public State() 
    {
        ShortName = string.Empty;
    }

    public override bool Equals(object obj)
    {
        if (obj is State)
        {
            State otherState = obj as State;
            return ShortName.Equals(otherState.ShortName);
        }
        else
        {
            return false;
        }
    }
}

, Прежде чем мы начнем, я установил DataContext своего Окна, чтобы быть экземпляром моего правильно созданного RootViewModel.

<tk:DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False">
            <tk:DataGrid.Columns>
                <tk:DataGridTemplateColumn Header="State">
                    <tk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=State.ShortName, Mode=TwoWay}" />
                        </DataTemplate>
                    </tk:DataGridTemplateColumn.CellTemplate>
                    <tk:DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox 
                                x:Name="cboDonationPurpose" 
                                SelectedItem="{Binding Path=State, Mode=TwoWay}" 
                                ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window},Mode=FindAncestor}, Path=DataContext.USStates}" 
                                DisplayMemberPath="ShortName" 
                                SelectedValuePath="ShortName" />
                        </DataTemplate>
                    </tk:DataGridTemplateColumn.CellEditingTemplate>
                </tk:DataGridTemplateColumn>
            </tk:DataGrid.Columns>
        </tk:DataGrid>

Для SelectedItem для привязки правильно я должен удостовериться, что переопределил, Равняется методу на моем объекте, так как под капотом, WPF использует этот метод для определения, кто SelectedItem или нет. Я думаю, что это было существенно Вашей проблемой с начала, которое заставило Вас пытаться связать с SelectedValue вместо SelectedItem.

6
ответ дан 1 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: