0

ResourceDictionaryに対してアイテムをバインドしようとするとRectangle.Child、例外が発生します。

ArgumentException: Value does not fall within the expected range.

次に例を示します。

<UserControl.Resources>
    <local:PersonConverter x:Key="MyConverter"/>
</UserControl.Resources>

<ListBox ItemsSource="{Binding Persons}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border Child="{Binding Gender, Converter={StaticResource MyConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

そして背後にあるコード:

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        Persons = new List<Person> {new Person("Female"), new Person("Male")};
    }

    public List<Person> Persons { get; private set; }
}

public class PersonConverter : IValueConverter
{
    private ResourceDictionary Items { get; set; }

    public PersonConverterRes()
    {
        Items = new ResourceDictionary
            {
                {"Male", new Canvas() {
                                 Background = new SolidColorBrush(Colors.Blue),
                                 Height = 100, Width = 100}},
                {"Female", new Canvas() {
                                 Background = new SolidColorBrush(Colors.Magenta),
                                 Height = 100, Width = 100}}
            };
    }

    public object Convert(object value, Type targetType, object parameter,
                          System.Globalization.CultureInfo culture)
    {
        return Items[value.ToString()];
    }

    ...
}

public class Person
{
    public Person(String gender)
    {
        Gender = gender;
    }

    public String Gender { get; private set; }
}

しかし、をResourceDictionaryプレーンに置き換えるとDictionary<String, UIElement>、バインディングは正常に機能します。

public class PersonConverter : IValueConverter
{
    private Dictionary<String, UIElement> Items { get; set; }

    public PersonConverterRes()
    {
        Items = new Dictionary<String, UIElement>
            {
                {"Male", new Canvas() {
                                 Background = new SolidColorBrush(Colors.Blue),
                                 Height = 100, Width = 100}},
                {"Female", new Canvas() {
                                 Background = new SolidColorBrush(Colors.Magenta),
                                 Height = 100, Width = 100}}
            };
    }

    ...
}

この例外の原因を知っている人はいますか?

注: WinRT でもこれを試しました。そこでは、コードは例外をスローしませんが、ResourceDictionary. おそらく静かに失敗していると思います。

4

2 に答える 2

2

Childではないため、データバインディングを使用して のプロパティにバインドすることBorderはできませんDependencyProperty。これが、 ResourceDictionary アプローチが機能しない理由です。

また、WPF/Silvelight/WinRT でのデータ バインディングは、意図的にサイレントに失敗するため (これは機能であり、正しく使用すると非常に便利です)、その推測は正しいでしょう。

于 2012-09-14T07:55:46.720 に答える
2

これをしないでください。

トリガーを使用して Canvas.Background を設定する方がエレガントです

<ListBox ItemsSource="{Binding Persons}">
   <ListBox.ItemTemplate>
       <DataTemplate>
           <Border <!-- set properties --> >
               <Canvas Height="100" Width="100">
                  <Canvas.Style>
                      <Style TargetType="Canvas">
                        <Style.Triggers>
                            <DataTrigger Binding={Binding Gender} Value="Male">
                                  <Setter Property="Background" Value="Blue"/>
                            </DataTrigger>
                            <DataTrigger Binding={Binding Gender} Value="Female">
                                  <Setter Property="Background" Value="Magenta"/>
                            </DataTrigger>
                        </Style.Triggers>
                      </Style>
                  </Canvas.Style>
               </Canvas>
           </Border>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>
于 2012-09-14T07:59:43.890 に答える