2012-09-14 101 views
0

當我嘗試對Rectangle.Child一個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; } 
} 

但是,如果我用一個簡單的Dictionary<String, UIElement>綁定工作正常更換ResourceDictionary

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不起作用。我想這可能會失敗。

回答

2

您不能使用數據綁定來綁定BorderChild屬性,因爲它不是DependencyProperty。這就是爲什麼你的ResourceDictionary方法不起作用。另外,WPF/Silvelight/WinRT中的數據綁定在設計時會默默地失敗(這是一個功能,如果使用得當,它是一個非常有用的功能),所以你的猜測是正確的。

+0

當然。我沒有想到這一點。謝謝。 –

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> 
+0

當然,如果我只是設置Canvas.Background財產,這是我會怎麼做。在我的實際情況然而,我需要根據我的數據綁定對象集合的某些屬性的值來顯示不同的畫布對象(每個都包含不同的子對象)。這就是爲什麼我試圖將UIElement對象綁定到Rectangle.Child。不過,這是一個很好的回答了我的問題簡化:) –

+1

好吧,這仍然是一個錯誤的做法。在你的情況下,然後創建不同的DataTemplates並使用ItemTemplateSelector來決定顯示哪個 –

+0

是的,這聽起來像一個更好的方法。我會放棄這一點。 –