WPF DataGrid привязка - PullRequest
       1

WPF DataGrid привязка

0 голосов
/ 16 июля 2011

Я столкнулся с проблемой, когда IList привязан к сетке данных.

Структура класса,

public class Customer
{
    public virtual int CustomerID { get; set; }
    public virtual string Name { get; set; }
    public virtual string AddressLine1 { get; set; }
    public virtual string AddressLine2 { get; set; }
    public virtual string AddressLine3 { get; set; }
    public virtual bool IsActive { get; set; }
    public virtual SalesLine SalesLine { get; set; }
    public virtual int Precedence { get; set; }
}

public class SalesLine
{
    public virtual int SalesLineID { get; set; }
    public virtual string Name { get; set; }
    public virtual SalesPerson SalesPerson { get; set; }
    public virtual IList<Customer> Customers { get; set; }
}

Я создаю новый IList класса Customer.

IList<Customer> customerList = new IList<Customer>();

Затем заполняется "customerList". Поскольку у клиента есть SalesLine, IList «salesLines» заполняется всеми строками в базе данных.

Теперь, следуя XAML, я собираюсь связать customerList с сеткой данных,

<DataGrid AutoGenerateColumns="False" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch"  
                  Name="grdCustomers" VerticalAlignment="Stretch" Grid.ColumnSpan="2" 
                  ItemsSource="{Binding CustomerList}" CanUserAddRows="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="250" />
                <DataGridTextColumn Header="Address Street" Binding="{Binding AddressLine1}" Width="150" />
                <DataGridTextColumn Header="Address Town" Binding="{Binding AddressLine2}" Width="150" />
                <DataGridTextColumn Header="Address Area" Binding="{Binding AddressLine3}" Width="150" />
                <DataGridCheckBoxColumn Header="Is Active" Binding="{Binding IsActive}" Width="75" />
                <DataGridComboBoxColumn Header="Sales Line"  Width="150"
                        SelectedItemBinding="{Binding  SalesLine}"
                        SelectedValuePath="SalesLineID"
                        DisplayMemberPath="Name">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SalesLineList}"/>
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SalesLineList}"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>

Теперь корректно отображаются все столбцы, кроме столбца строки продаж.

Несмотря на то, что я связал SalesLine со столбцом, он не отображает имя строки текущей строки в сетке. Однако, когда я нажимаю на раскрывающееся окно, раскрывающееся окно заполняется.

Помогите, пожалуйста, отобразить название строки продажи в столбце строки продажи.

1 Ответ

1 голос
/ 17 июля 2011

Вероятно, это связано с тем, что свойство Customer.SalesLine не указывает на объект в SalesLineList

Необходимо перезаписать метод ToString() в классе SalesLine, чтобы два объекта были одинаковыми, если их идентификаторы совпадают. По умолчанию он будет считать их одинаковыми, только если они ссылаются на один и тот же объект в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...