Датагрид не показывает данные, хотя его данные - PullRequest
0 голосов
/ 11 декабря 2011

У меня проблема с моей реализацией MVVM Light, в которой мои контекстные данные и сетка WPF Toolkit DataGrid привязаны к правильному объекту, но данные не отображаются.Может кто-нибудь сказать мне, что я делаю не так?

Вот мой код:

MainViewModel.cs

public class MainViewModel : ViewModelBase
{

    private static Logger logger = LogManager.GetCurrentClassLogger();
    private C.Wsi.ClientSession privateSession;

    private ObservableCollection<CashAccount> _cashaccounts;

    public ObservableCollection<CashAccount> CashAccounts
    {
        get { return _cashaccounts; }
        set
        {
            if (_cashaccounts.Equals(value))
            {
                return;
            }
            _cashaccounts = value;
            RaisePropertyChanged("CashAccounts");
        }
    }

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {

            _cashaccounts = new ObservableCollection<CashAccount>();

             // Subscribe to CollectionChanged event
          _cashaccounts.CollectionChanged += OnCashAccountListChanged;

            logger.Info("-----  Start   -----");

            // Code runs "for real"
            Cs.Helper.Session session = new Session();
            privateSession = session.getSession();
            logger.Info("Private Session: " + privateSession.GetHashCode());
            logger.Info("...Connected.....");

            Cs.Helper.ResultSet results = new ResultSet();

            PositionBean[] pos = results.getPositions(privateSession);
            logger.Info("Positions returned: " + pos.Length);

            SecurityBean[] secs = results.getSecurities(privateSession);
            logger.Info("Securities returned: " + secs.Length);

            ArrayBuilder ab = new ArrayBuilder(pos, secs);
            CashAccount c = new CashAccount();
            c.qtySod = 100.00;
            c.name = "Hi";
            c.account = "Acct1";
            c.cashAmount = 67.00;
            _cashaccounts.Add(c);
            RaisePropertyChanged("CashAccounts");
            //this._cashaccounts=ab.joinPositionSecurities();
        }
    }
     void OnCashAccountListChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
     {

      }


    ////public override void Cleanup()
    ////{
    ////    // Clean up if needed

    ////    base.Cleanup();
    ////}
}

MainWindow.xaml

<Window x:Class="CreditSuisse.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CreditSuisse.Helper"
    xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
    mc:Ignorable="d"
    Height="301"
    Width="520"
    Title="Credit Suisse - Custodial Cash Application"
    DataContext="{Binding Path=Main, Source={StaticResource Locator}}">

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Skins/MainSkin.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <local:VisibilityConverter x:Key="VisibilityConverter" />

        <!-- DataGrid Background -->
        <LinearGradientBrush x:Key="BlueLightGradientBrush" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Offset="0" Color="#FFEAF3FF"/>
            <GradientStop Offset="0.654" Color="#FFC0DEFF"/>
            <GradientStop Offset="1" Color="#FFC0D9FB"/>
        </LinearGradientBrush>

        <!-- DatGrid style -->
        <Style TargetType="{x:Type dg:DataGrid}">
            <Setter Property="Margin" Value="5" />
            <Setter Property="Background" Value="{StaticResource BlueLightGradientBrush}" />
            <Setter Property="BorderBrush" Value="#FFA6CCF2" />
            <Setter Property="RowBackground" Value="White" />
            <Setter Property="AlternatingRowBackground" Value="#FDFFD0" />
            <Setter Property="HorizontalGridLinesBrush" Value="Transparent" />
            <Setter Property="VerticalGridLinesBrush" Value="#FFD3D0" />
            <Setter Property="RowHeaderWidth" Value="0" />
        </Style>

        <!-- Enable rows as drop targets -->
        <Style TargetType="{x:Type dg:DataGridRow}">
            <Setter Property="AllowDrop" Value="True" />
        </Style>

    </ResourceDictionary>
</Window.Resources>

<dg:DataGrid DataContext="{Binding MainViewModel}" ItemsSource="{Binding CashAccounts}">
          Margin="5" AutoGenerateColumns="True" HorizontalScrollBarVisibility="False">
    <dg:DataGrid.Columns>
        <dg:DataGridTextColumn Binding="{Binding account}" Header="Account Code" />
        <dg:DataGridTextColumn Binding="{Binding name}" Header="Security Name" />
        <dg:DataGridTextColumn Binding="{Binding cashAmount}" Header="Quantity Start of Day" />
        <dg:DataGridTextColumn Binding="{Binding price}" Header="Cash Delta (Price Delta)" />
        <dg:DataGridTemplateColumn Header="Action">
            <dg:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Get" Visibility="{Binding cashChanged, Converter={StaticResource VisibilityConverter}}" Background="Red" />
                </DataTemplate>
            </dg:DataGridTemplateColumn.CellTemplate>
        </dg:DataGridTemplateColumn>
    </dg:DataGrid.Columns>
</dg:DataGrid>

1 Ответ

0 голосов
/ 11 декабря 2011

Когда вы делаете DataContext="{Binding Path=Main, Source={StaticResource Locator}}" в вашем Окне и после DataContext="{Binding MainViewModel}" в Datagrid, WPF пытается привязаться к property named MainViewModel в вашем MainViewModel классе, что не удастся. Вы можете подтвердить это, посмотрев на ошибку привязки в окне «Вывод» в VS.
Просто удалите DataContext="{Binding MainViewModel}" из DataGrid, и оно должно работать.

EDIT: В конце первой строки вашего XAML есть дополнительное закрытие>:

<dg:DataGrid DataContext="{Binding MainViewModel}" ItemsSource="{Binding CashAccounts}">
          Margin="5" AutoGenerateColumns="True" HorizontalScrollBarVisibility="False">

Должно быть:

<dg:DataGrid DataContext="{Binding MainViewModel}" ItemsSource="{Binding CashAccounts}"
          Margin="5" AutoGenerateColumns="True" HorizontalScrollBarVisibility="Disabled">

Примечание: False не является допустимым значением для HorizontalScrollBarVisibility, оно поддерживает Auto, Disabled, Hidden, Visible

Но я не знаю, почему WPF выдает Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead для вашего исходного XAML вместо какой-то более значимой ошибки.

...