Двухстороннее связывание не работает правильно - PullRequest
0 голосов
/ 12 января 2012

Я использую WPF MVVM Pattern. У меня есть 2 ListBoxes и DataGrid на мой взгляд. Я использую EntityFramework для получения данных с SQL Server. Моя ViewModel выглядит так

    private Types _type;
    private Users _user;
    private ObjectResult<APP> _dataContext;

    public IEnumerable<Types> Categories
    {
        get;
        private set;
    }

    public IEnumerable<Users> SystemNames
    {
        get;
        private set;
    }

    public Types SelectedType
    {
        get
        {
            return _type;
        }
        set
        {
            _type = value;
            RaisePropertyChanged("SelectedType");
        }
    }       

    public Users SelectedUser
    {
        get
        {
            return _user;
        }
        set
        {
            _user = value;
            RaisePropertyChanged("SelectedUser");
        }
    }

    public ObjectResult<APP> DContext
    {
        get
        {
            return _dataContext;
        }
        set
        {
            _dataContext = value;
            RaisePropertyChanged("DContext");
        }
    }

    public ObjectResult<APP> GetDataContext()
    {
        AppLogEntities context = new AppLogEntities();
        return context.GetAppLog(SelectedUser.User, SelectedType.Type);
    }

    public DetailsViewModel()
    {
        Categories = new List<Types>
        {
            new Types{Type = "All"},
            new Types{Type = "Information"},
            new Types{Type = "Warning"},
            new Types{Type = "Error"}
        };

        SystemNames = new List<Users>
        {
            new Users{User = "All"},
            new Users{User = "SYS_01"},
            new Users{User = "SYS_02"}
        };

        SelectedType = new Types();
        SelectedUser = new Users();

        DContext = GetDataContext();
    }`

И мой взгляд выглядит так

<Window x:Class="SingleAppLogMVVM.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:SingleAppLogMVVM"
    Title="MainWindow" Height="800" Width="1000">
<Window.DataContext >
    <vm:DetailsViewModel />
</Window.DataContext>
<Grid>
    <ListBox Height="200" HorizontalAlignment="Left" Margin="50,50,0,0" Name="fTypeListBox" VerticalAlignment="Top" Width="125" SelectionMode="Single" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Categories}" SelectedItem="{Binding SelectedType, Mode=TwoWay}" >
        <ListBox.ItemTemplate >
            <DataTemplate >
                <DockPanel Width="120" LastChildFill="True" >
                    <TextBlock Text="{Binding Type, Mode=TwoWay}" Width="110" Margin="5" />
                </DockPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <ListBox Height="Auto" HorizontalAlignment="Left" Margin="50,275,0,50" Name="fUserListBox" VerticalAlignment="Stretch" Width="125" SelectionMode="Single" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding SystemNames}" SelectedItem="{Binding SelectedUser, Mode=TwoWay}"  >
        <ListBox.ItemTemplate >
            <DataTemplate >
                <DockPanel Width="120" LastChildFill="True" >
                    <TextBlock Text="{Binding User, Mode=TwoWay}" Width="110" Margin="5" />
                </DockPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <DataGrid AutoGenerateColumns="False" Height="350" HorizontalAlignment="Stretch" Margin="225,50,50,0" IsReadOnly="True" Width="Auto"
              VerticalAlignment="Top" CanUserReorderColumns="False" CanUserResizeColumns="False" Name="fDGrid"  VirtualizingStackPanel.IsVirtualizing="True"
              CanUserResizeRows="False" IsManipulationEnabled="True" RowHeight="35" SelectionMode="Single" VirtualizingStackPanel.VirtualizationMode="Recycling"
              ItemsSource="{Binding DContext, Mode=OneWay}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}" Width="5*" />
            <DataGridTextColumn Header="IID" Binding="{Binding Path=IID}" Width="5*" />
            <DataGridTextColumn Header="INSTANCEID" Binding="{Binding Path=INSTANCEID}" Width="10*" />
            <DataGridTextColumn Header="TYPE" Binding="{Binding Path=TYPE}" Width="10*" />
            <DataGridTextColumn Header="SOURCE" Binding="{Binding Path=SOURCE}" Width="10*" />
            <DataGridTextColumn Header="TIME" Binding="{Binding Path=TIME}" Width="10*" />
            <DataGridTextColumn Header="SNAME" Binding="{Binding Path=SNAME}" Width="10*" />
            <DataGridTextColumn Header="MESSAGE" Binding="{Binding Path=MESSAGE}" Width="15*" />
            <DataGridTextColumn Header="ACTIONS" Binding="{Binding Path=ACTIONS}" Width="15*" />
            <DataGridTextColumn Header="CLEARED ON" Binding="{Binding Path=CLEAREDON}" Width="10*" />
        </DataGrid.Columns>
    </DataGrid>        
</Grid>

Я могу заполнить свои LisBox-ы. А также я могу заполнить свой DataGrid, если плагин устанавливает значения вручную в моем коде ViewModel

 public ObjectResult<APP> GetDataContext()
    {
        AppLogEntities context = new AppLogEntities();
        return context.GetAppLog(SelectedUser.User, SelectedType.Type);
    }

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

Ответы [ 2 ]

1 голос
/ 12 января 2012

требуется пара небольших изменений, чтобы получить результаты, которые вы после

public Types SelectedType
{
    get
    {
        return _type;
    }
    set
    {
        _type = value;
        RaisePropertyChanged("SelectedType");
        DContext = GetDataContext(); //refresh the data
    }
}       

public Users SelectedUser
{
    get
    {
        return _user;
    }
    set
    {
        _user = value;
        RaisePropertyChanged("SelectedUser");
        DContext = GetDataContext(); //refresh the data
    }
}


public DetailsViewModel()
{
    Categories = new List<Types>
    {
        new Types{Type = "All"},
        new Types{Type = "Information"},
        new Types{Type = "Warning"},
        new Types{Type = "Error"}
    };

    SystemNames = new List<Users>
    {
        new Users{User = "All"},
        new Users{User = "SYS_01"},
        new Users{User = "SYS_02"}
    };

    _type = new Types();  //use the field rather than the property so GetDatacontenxt doesnt get called multiple times
    _user = new Users();
    DContext = GetDataContext();
}
1 голос
/ 12 января 2012

вам нужно будет вручную вызывать GetDataContext() каждый раз, когда ваши свойства SelectedUser и SelectedType изменяются в модели представления. Установщики свойств - хороший способ сделать это - хотя, если GetDataContext() - длительная операция, вы должны делать это асинхронно, чтобы пользовательский интерфейс не зависал во время загрузки результатов.

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