2

私はこれから始めます: ビットごとのフラグ列挙型 とこれ: 列挙型メンバーへのアクセス

これは私のコードです

[Flags]
public enum DeliveryDays
{
    [Description("None")]
    NONE = 0, // 0000000

    [Description("monday")]
    MON = 1,  // 0000001

    [Description("tuersady")]
    TUE = 2,  // 0000010

    [Description("wedsnay")]
    WED = 4,  // 0000100

    [Description("thursday")]
    THU = 8,  // 0001000

    [Description("friday")]
    FRI = 16, // 0010000

    [Description("saturday")]
    SAT = 32, // 0100000

    [Description("sunday")]
    SUN = 64, // 1000000

    WORKDAYS = MON | TUE | WED | THU | FRI,  //0011111
    WEEKENDS = SAT | SUN  //1100000
} 

public class Finder 
{
    public DeliveryDays AvailableDays = DeliveryDays.WEEKENDS;

    public DeliveryDays SelectedDays { get; set; }

    public Finder()
    {
        SelectedDays = DeliveryDays.NONE;
    }    
}

これはXAMLです

<ComboBox Height="50"
          ItemsSource="{Binding Source={my:Enumeration {x:Type my:DeliveryDays}}}"
          DisplayMemberPath="Description"
          SelectedValue="{Binding SelectedDays}"
          SelectedValuePath="Value" />

コンボボックスにはすべての列挙型が表示されますが、インスタンスメンバーフィールドDeliveryDaysには列挙型の値のみが必要です。そのため、フィールドに列挙値のみを表示AvailableDaysするようにカスタムを変更する必要があります。カスタムメソッドからこのフィールドにアクセスするにはどうすればよいですか? XAML で可能でない場合、回避策はありますか?MarkupExtensionAvailableDaysEnumListExtension

ありがとう

4

1 に答える 1

1

純粋な XAML ソリューションについては知りませんが、これは機能します。

列挙型でテストしましたUriKind(速度のため)。ソリューション全体を見るだけで簡単だと思います。

これはXAMLです

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:sysSys="clr-namespace:System;assembly=System"
        xmlns:cm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Window.Resources>
        <ObjectDataProvider x:Key="UriKindProvider"
                            ObjectType="{x:Type sys:Enum}"
                            MethodName="GetValues">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="sysSys:UriKind" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <CollectionViewSource x:Key="EnumCollection"
                              Source="{StaticResource UriKindProvider}"
                              Filter="CollectionViewSource_Filter"/>
    </Window.Resources>
    <Grid>
        <ComboBox HorizontalAlignment="Center"
                  VerticalAlignment="Center"
                  ItemsSource="{Binding Source={StaticResource EnumCollection}}" />
    </Grid>
</Window>

これはコードビハインドです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
        {
            var valueToCompare = (UriKind)e.Item;
            e.Accepted = IsInAvailableDays(valueToCompare);
        }

        private bool IsInAvailableDays(UriKind value)
        {
            //this is for testing only, replace with actual logic to compare to AvailableDays
            if (value.ToString().Contains("Abs"))
            {
                return true;
            }
            return false;
        }
    }
}

これを実行すると、値が "RelativeOrAbsolute" と "Absolute" のみのコンボが表示されます ("Relative" は除外されます)。

于 2012-04-30T18:19:18.120 に答える