Сохранение выбора радиокнопки в настройках - PullRequest
3 голосов
/ 29 января 2010

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

Я создал следующее перечисление

public enum FType
{
    None,
    Delimited,
    FixedWidth,
    XML
};

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

Я предполагал, что смогу преобразовать enum в строку, а затем преобразовать обратно, но, будучи немного нубом, когда дело касается WPF, я не совсем уверен, с чего начать.

Вот код, который я сгенерировал до сих пор:

app.xaml

<Application x:Class="Widget.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:properties="clr-namespace:Widget.Properties"
    StartupUri="Window1.xaml"
    Exit="Application_Exit">
    <Application.Resources>
        <properties:Settings x:Key="Settings" />
    </Application.Resources>
</Application>

App.xaml.cs

public partial class App : Application
{
    private void Application_Exit(object sender, ExitEventArgs e)
    {
        Widget.Properties.Settings.Default.Save();
    }
}

Windows.xaml

<Window x:Class="Widget.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Widget"
    Title="Window1" Height="85" Width="300">
    <Window.Resources>
        <local:EnumBooleanConverter x:Key="enumBooleanConverter"/>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <RadioButton GroupName="FileType" Content="Delimited"   IsChecked="{Binding Path=Default.FileType, Mode=TwoWay, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Delimited}" />
            <RadioButton GroupName="FileType" Content="Fixed Width" IsChecked="{Binding Path=Default.FileType, Mode=TwoWay, Converter={StaticResource enumBooleanConverter}, ConverterParameter=FixedWidth}"/>
            <RadioButton GroupName="FileType" Content="XML"         IsChecked="{Binding Path=Default.FileType, Mode=TwoWay, Converter={StaticResource enumBooleanConverter}, ConverterParameter=XML}"/>
        </StackPanel>
    </Grid>
</Window>

Converter.cs

    public class EnumBooleanConverter : IValueConverter
    {
        public EnumBooleanConverter()
        {
        }

        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string parameterString = parameter as string;
            if (parameterString == null)
                return DependencyProperty.UnsetValue;

            if (Enum.IsDefined(value.GetType(), value) == false)
                return DependencyProperty.UnsetValue;

            object parameterValue = Enum.Parse(value.GetType(), parameterString);

            return parameterValue.Equals(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string parameterString = parameter as string;
            if (parameterString == null)
                return DependencyProperty.UnsetValue;

            return Enum.Parse(targetType, parameterString);
        }
        #endregion
     }

1 Ответ

1 голос
/ 30 января 2010

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

  • Я думаю, вы должны указать DataContext для своих RadioButton с. Просто измените ваш Window1 следующим образом:

    <StackPanel DataContext="{StaticResource Settings}">
        <RadioButton GroupName=... />
        <RadioButton GroupName=... />
        <RadioButton GroupName=... />
    </StackPanel>
    

    (Примечание: если StaticResource не работает, попробуйте использовать DynamicResource)

  • Во-вторых, из вашего поста кажется, что вы сохраняете значения как string в настройках. Просто измените это и вместо этого установите тип данных FileType в Ftype. (Если вы не знаете, как это сделать, скажите мне)

После внесения этих двух изменений вы, безусловно, получите эту работу! Я надеюсь;)

...