Поле со списком Micro Binding Caliburn в списке - PullRequest
0 голосов
/ 28 мая 2020

Это близко к тому, чего я хочу достичь, но не совсем. Я хочу, чтобы в поле со списком отображались все отделы, но отображался только отдел, связанный с сотрудником. Надеюсь, кто-нибудь поймет, в чем заключается моя ошибка. Новое в WPF и Caliburn.

Вот мои модели:

public class Department
{
    public int IdDept { get; set; }
  public string NameDept { get; set; }
}
  public class Employee
{
    public int IdEmployee { get; set; }
    public string NameEmployee { get; set; }
    public int DeptId { get; set; }
}

ViewModel:

 public class ShellViewModel : PropertyChangedBase
{
    private BindableCollection<Employee> _employees = new BindableCollection<Employee>();
    private BindableCollection<Department> _departments= new BindableCollection<Department>();
    public BindableCollection<Employee> Employees
    {
        get{return _employees;}
        set
        { _employees = value; NotifyOfPropertyChange(() => Employees);}
    }
    public BindableCollection<Department> Departments
    {
        get{return _departments;}
        set{_departments = value;
            NotifyOfPropertyChange(() => Departments);}
    }

    public ShellViewModel()
    {// simulated data from DB
        Employees.Add(new Employee { IdEmployee = 1, NameEmployee = "Jim", DeptId = 1 });
        Employees.Add(new Employee { IdEmployee = 2, NameEmployee = "Mike", DeptId = 3 });

        Departments.Add(new Department { IdDept = 1, NameDept = "Accounting" });
        Departments.Add(new Department { IdDept = 2, NameDept = "Human Resource" });
        Departments.Add(new Department { IdDept = 2, NameDept = "IT" });
    }
}

}

View:

<Grid>
    <ListBox x:Name="Employees" HorizontalAlignment="Left" Height="260" Margin="83,52,0,0" VerticalAlignment="Top" Width="612">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="50"/>
                        </Grid.ColumnDefinitions>
                        <TextBox Text="{Binding NameEmployee}" Grid.Column="1" />
                    <TextBlock Text="{Binding IdEmployee}" Grid.Column="0"/>
                    <ComboBox Grid.Column="2"
                              ItemsSource="{Binding DataContext.Departments,
                        RelativeSource={RelativeSource Mode=FindAncestor,
                        AncestorType={x:Type Window}}}"
                              SelectedValuePath="DeptId"
                              DisplayMemberPath="NameDept"
                              SelectedValue="{Binding IdDept}"/>
                    </Grid>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

</Grid>

1 Ответ

0 голосов
/ 28 мая 2020

имена свойств переключателя в привязке SelectedValuePath и SelectedValue:

SelectedValuePath="IdDept"
SelectedValue="{Binding DeptId}"

SelectedValuePath должно быть свойством, которое существует в элементах ComboBox.ItemsSource - таким образом, Department.IdDept

SelectedValue должно быть свойством, которое существует в ComboBox DataContext (объект Employee) - таким образом, Employee.DeptId

...