WPF ListView存储项条件

时间:2016-10-11 11:01:18

标签: c# wpf listview

例如,当引发双击事件时,我有ListView,项目chang FontWeight。如何将状态保存到下一个程序启动?使用数据库?什么是更好的存储在数据库字符串变量,如Bold,ExtraBold,Normal。还是价值观?

存储状态的常用方法是什么

<Window.Resources>
    <Style x:Key="itemstyle" TargetType="{x:Type ListViewItem}">
        <EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" />
    </Style>
</Window.Resources>
<Grid Background="#FFF0F0F0">
    <ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedEmployee}" Margin="0,0,0,62" ItemContainerStyle="{StaticResource itemstyle}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="FirstName">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding FirstName}" FontWeight="{Binding FontWeight}" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="SecondName">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding FirstName}" FontWeight="{Binding FontWeight}" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <CheckBox Content="HideAllNormal" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" HorizontalAlignment="Left" Margin="69,290,0,0" VerticalAlignment="Top"/>
</Grid>

代码:

namespace WpfApplication27
{
    public partial class MainWindow : Window
    {
        ListViewModel LVM = new ListViewModel();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = LVM;
        }

        protected void HandleDoubleClick(object sender, MouseButtonEventArgs e)
        {
            LVM.SelectedEmployee.FontWeight = FontWeights.Normal;
        }

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            LVM.HideAllBold();
        }

        private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
            LVM.ShowAll();
        }
    }

    public class ListViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<Employee> items;

        public ObservableCollection<Employee> Items
        {
            get
            {
                return items;
            }

            set
            {
                items = value;
                RaisePropertyChaged("Items");
            }
        }

        private ObservableCollection<Employee> WithBoldItems;

        public Employee SelectedEmployee { get; set; }

        public ListViewModel()
        {
            Items = new ObservableCollection<Employee>();
            for (int i = 0; i < 10; i++)
            {
                Employee emp = new Employee();
                emp.Number = i;
                emp.FirstName = "Test";
                emp.FontWeight = (FontWeight)new FontWeightConverter().ConvertFromString("Bold");
                Items.Add(emp);
            }
        }

        public void HideAllBold()
        {
            WithBoldItems = Items;
            Items = new ObservableCollection<Employee>(Items.Where(key => key.FontWeight != FontWeights.Bold));
        }

        public void ShowAll()
        {
            Items = WithBoldItems;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void RaisePropertyChaged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

    }

    public class Employee : INotifyPropertyChanged
    {
        public int Number { get; set; }

        public string FirstName { get; set; }

        private FontWeight fontWeight = FontWeights.Normal;

        public FontWeight FontWeight
        {
            get
            {
                return fontWeight;
            }

            set
            {
                fontWeight = value;
                RaisePropertyChaged("FontWeight");
            }
        }

        private void RaisePropertyChaged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

1 个答案:

答案 0 :(得分:0)

我已将状态保存在主应用程序检查中,希望它有所帮助。

        /// <summary>
        /// Initializes the singleton application object.  This is the first line of authored code
        /// executed, and as such is the logical equivalent of main() or WinMain().
        /// </summary>
        public App()
        {
            Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync(
            Microsoft.ApplicationInsights.WindowsCollectors.Metadata |
            Microsoft.ApplicationInsights.WindowsCollectors.Session);

            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

    /// <summary>
    /// Invoked when the application is launched normally by the end user.  Other entry points
    /// will be used such as when the application is launched to open a specific file.
    /// </summary>
    /// <param name="e">Details about the launch request and process.</param>
    protected async override void OnLaunched(LaunchActivatedEventArgs e)
    {
        #if DEBUG
                    Debug.WriteLine($"Installed location: {Windows.ApplicationModel.Package.Current.InstalledLocation.Path}");

                    if (System.Diagnostics.Debugger.IsAttached)
                    {
                        this.DebugSettings.EnableFrameRateCounter = false;
                    }

    #endif




        RootFrame = Window.Current.Content as Frame;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active
        if (RootFrame == null)
        {
            // Create a Frame to act as the navigation context and navigate to the first page
            RootFrame = new Frame();

            RootFrame.NavigationFailed += OnNavigationFailed;

            Debug.WriteLine(e.PreviousExecutionState);


            if (e.PreviousExecutionState == ApplicationExecutionState.Terminated || e.PreviousExecutionState == ApplicationExecutionState.ClosedByUser)
            {

                await xxxxx.Common.SuspensionManager.RestoreAsync();



            }


            if (true)
            {
                try
                {
                        await xxxx(await Utils.DeserializeXML<xxx>(
                        await ApplicationData.Current.LocalFolder.GetFileAsync("xxx.xml")));
                }
                catch
                {
                    Debug.WriteLine("No in xxx");
                }
            }



            // Place the frame in the current Window
            Window.Current.Content = RootFrame;
            await AssetManager.InitAssets();
            // Place the frame in the current Window


            await AssetManager.FetchAssets();

        }

        if (RootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter

            if (App.xxxx == null || App.xxxx.SessionId == null)
                RootFrame.Navigate(typeof(xxxPage), e.Arguments);
            else
                RootFrame.Navigate(typeof(MainPage), e.Arguments);
        }

        // Ensure the current window is active
        Window.Current.Activate();





    }


    void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
    {
        throw new Exception("xxxxxx " + e.SourcePageType.FullName);
    }


    private async void OnSuspending(object sender, SuspendingEventArgs e)
    {
        // it would be best to have a SUSPEND state in the statechart for every possible
        // state, but it's ok for now
        Utils.ReleaseDisplay();

        var deferral = e.SuspendingOperation.GetDeferral();

        try {
            if (App.LoggedUser != null)
            {
                await Utils.SerializeXML(await ApplicationData.Current.LocalFolder.CreateFileAsync(
                "xxx.xml", CreationCollisionOption.ReplaceExisting), xxxxx);
                await Utils.SerializeXML(await App.xxxFolder.CreateFileAsync(
                "xxx.xml", CreationCollisionOption.ReplaceExisting), App.State);
            }
        }
        catch (Exception e2)
        {
            Debug.WriteLine(e2);
        }

        await xxxxx.Common.SuspensionManager.SaveAsync();
        deferral.Complete();
    }

}