簡體   English   中英

XAML將可觀察的集合綁定到DataGrid

[英]XAML Binding Observable Collection to DataGrid

我在基於其他屬性進行數據綁定時遇到麻煩。 我的組合框工作正常,但數據網格卻沒有。 我正在嘗試使用DataContext="{Binding RelativeSource={RelativeSource Self}}"將窗口綁定到背后的代碼,這樣我可以設計Intellisense,但是我使用x:Name:"_Window"

HRRM的模型有很多實體,而且我知道我嘗試綁定的屬性也拼寫正確等。但是我不知道為什么DataGrid不會顯示雇員。 我還確保將數據放置在可觀察的集合中,並且嘗試將項目源僅綁定到ListEmployees和SmsEmployees,而我嘗試過的任何方法都沒有起作用。 這是我嘗試過的最后一部分代碼。

<Window x:Class="GUI.Employees.Misc.SendSms"
    x:Name="_Window"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Send SMS" Height="525" Width="1000" DataContext="{Binding ElementName=_Window}">

<Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="270*" />
        <ColumnDefinition Width="150" />
        <ColumnDefinition Width="270*" />
    </Grid.ColumnDefinitions>
    <ComboBox Grid.Column="0" x:Name="cmbCompany" DisplayMemberPath="Name" ItemsSource="{Binding Path=Companies, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"  Margin="10,10,10,0" VerticalAlignment="Top" SelectionChanged="cmbCompany_SelectionChanged"/>
    <DataGrid Grid.Column="0" x:Name="dgEmployees" Margin="10,37,10,10" IsReadOnly="True"  AutoGenerateColumns="False" ItemsSource="{Binding Path=ListEmployees, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window} }">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Company" Binding="{Binding HRCo }"/>
            <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
            <DataGridTextColumn Header="Craft" Binding="{Binding StdCraft}"/>
        </DataGrid.Columns>
    </DataGrid>
    <DataGrid x:Name="dgSendSms" Margin="10,37,10,10" IsReadOnly="True" Grid.Column="2" ItemsSource="{Binding  SmsEmployees, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window} }">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Company" Binding="{Binding HRCo}"/>
            <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
            <DataGridTextColumn Header="Craft" Binding="{Binding StdCraft}"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button x:Name="cmdMoveAllHired" Content="&gt;&gt;" Margin="10,85,10,0" VerticalAlignment="Top" Grid.Column="1"
            Click="cmdMoveAllHired_Click" />
    <Button x:Name="cmdReturnSingleItem" Content="&gt;" Margin="10,122,10,0" VerticalAlignment="Top"
            Grid.Column="1"  Click="cmdReturnSingleItem_Click" />
    <Button x:Name="cmdMoveAllReturned" Content="&lt;&lt;" Margin="10,196,10,0" VerticalAlignment="Top"
            Grid.Column="1"  Click="cmdMoveAllReturned_Click" />
    <Button x:Name="cmdHireSingleItem" Content="&lt;" Margin="10,159,10,0" VerticalAlignment="Top" Grid.Column="1"
             Click="cmdHireSingleItem_Click" />
    <Button x:Name="cmdGenerate" Content="Generate" Grid.Column="1" Margin="10,0,10,10"
            VerticalAlignment="Bottom" Click="cmdGenerate_Click" Visibility="Collapsed" />
    <Button x:Name="cmdBack" Content="Back" Grid.Column="1" HorizontalAlignment="Left" Margin="10,249,0,0"
            VerticalAlignment="Top" Width="130" Click="cmdBack_Click" />

    <Button x:Name="cmdSendSMS" Content="Send SMS" Grid.Column="1" HorizontalAlignment="Left" Margin="10,316,0,0" VerticalAlignment="Top" Width="130" Click="cmdSendSMS_Click"/>

</Grid>

namespace GUI.Employees.Misc
{
public partial class SendSms
{
    public ObservableCollection<HQCO> Companies { get; set; }

    public ObservableCollection<HRRM> ListEmployees { get; set; }

    private ObservableCollection<HRRM> _smsEmployees;

    public ObservableCollection<HRRM> SmsEmployees {
        get { return _smsEmployees; }
        set { _smsEmployees = value;
        }
    }

    public SendSms()
    {
        InitializeComponent();
        Companies = new ObservableCollection<HQCO>(HQCO.GetActivePRCompanies());
        Companies.Insert(0, new HQCO { HQCo = 0, Name = "All" });
        // cmbCompany.SelectedItem = _companies.Single(x=>x.HQCo == 0);
        SmsEmployees = new ObservableCollection<HRRM>();
        ChangeCompany();
    }
    private void ChangeCompany()
    {
        if (((HQCO)cmbCompany.SelectedItem)?.HQCo == 0)
            foreach (var co in Companies)
                co.IsChecked = true;
        else
            foreach (var co in Companies)
                if (((HQCO)cmbCompany.SelectedItem) == co)
                    co.IsChecked = true;
                else
                    co.IsChecked = false;

        ListEmployees = new ObservableCollection<HRRM>(Facade.GetEmployeePhoneNumbers(Companies.ToList(), false).OrderBy(x => x.SortName));
    }
}

我不相信您的ListEmployees ItemsSource將更新DataGrid因為它不是DependencyProperty或您尚未實現INotifyPropertyChanged 它沒有更新,因為您正在為屬性分配一個新實例。

而是嘗試將其添加到您的構造函數中:

ListEmployees = new ObservableCollection<HRRM>();

這是您的ChangeCompany方法:

foreach (var employee in Facade.GetEmployeePhoneNumbers(Companies.ToList(), false).OrderBy(x => x.SortName))
{
    ListEmployees.Add(employee);
}

上面的內容實際上將使用ObservableCollection ,然后應更新UI。

我認為您的問題是如何分配Window的DataContext。 在XAML中,添加對命名空間的引用,以便Window可以找到您的SendSms視圖模型,然后在XAML中(請參見下文)或在Window的代碼后面分配DataContext屬性。 如果以這種方式設置DataContext,則在綁定到SendSms視圖模型時不需要使用RelativeSource,但是如果要查看更改,則還需要確保可觀察性集合的類填充有INotifyPropertyChanged實現。

<Window x:Name="_Window"
        xmlns:local="clr-namespace:GUI.Employees.Misc" >

 <!--  set the DataContext of this Window to an instance of SendSms  -->
<Window.DataContext>
    <local:SendSms />
</Window.DataContext>

<DataGrid ItemsSource="{Binding ListEmployees}">
   ...
</DataGrid>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM