2014-09-29 49 views
0

我仍然有很多麻烦,以正确理解在Windows Phone 8.1上的XAML绑定和MSDN上的文件似乎并没有真正帮助我。c#在列表框中的XAML多重绑定

我有两个结构。一个填充ListBox里面已经很好用的数据,它应该设置颜色,我不明白怎么做。

到目前为止我的代码看起来是这样的:

<ListBox x:Name="ListBox1" Margin="5" Width="Auto" Height="300" HorizontalAlignment="Left" ItemsSource="{Binding}" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Border x:Name="BorderTap" BorderThickness="2" CornerRadius="15" Margin="0" Height="80" Width="Auto" VerticalAlignment="Top"> 
      <Border.BorderBrush> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="{Binding borderStart}" Offset="0"/> 
       <GradientStop Color="{Binding borderStart}" Offset="0.7"/> 
       <GradientStop Color="{Binding borderEnd}" Offset="1"/> 
      </LinearGradientBrush> 
      </Border.BorderBrush> 
      <Border.Background> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="{Binding boxStart}" Offset="0"/> 
        <GradientStop Color="{Binding boxStart}" Offset="0.7"/> 
        <GradientStop Color="{Binding boxEnd}" Offset="1"/> 
       </LinearGradientBrush> 
      </Border.Background> 
      <Grid> 
       <Image HorizontalAlignment="Left" Margin="2,0,0,0" Height="120" Width="120" VerticalAlignment="Top" Source="Assets/due.png" Stretch="Fill" Grid.Row="1" Opacity="0.4" /> 
      <Grid> 
       <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="0,0,0,0" Grid.RowSpan="2"> 
       <StackPanel Width="30" HorizontalAlignment="Left" VerticalAlignment="Top" /> 
       <StackPanel HorizontalAlignment="Left" Height="Auto" Margin="0,0,0,0" VerticalAlignment="Center" Width="Auto"> 
        <Image HorizontalAlignment="Left" Height="51" Margin="0" Width="51" Source="Assets/fish.png" Stretch="Fill" RenderTransformOrigin="2.307,0.881" VerticalAlignment="Center"/> 
       </StackPanel> 
       <StackPanel Width="10" HorizontalAlignment="Left" VerticalAlignment="Top" /> 
       <StackPanel HorizontalAlignment="Left" Height="80" Width="Auto" Margin="0" Orientation="Vertical"> 
        <TextBlock HorizontalAlignment="Left" Height="Auto" Margin="0,20,0,0" TextWrapping="Wrap" Text="{Binding Name}" Width="Auto" VerticalAlignment="Top" FontSize="19" Foreground="Black" FontWeight="Bold"/> 
        <TextBlock HorizontalAlignment="Left" Height="Auto" Margin="0" TextWrapping="Wrap" Text="{Binding URL}" Width="Auto" VerticalAlignment="Top" Foreground="#FF0097FF"/> 
       </StackPanel> 
       </StackPanel> 
       </Grid> 
      </Grid> 
     </Border> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

structures这样的:

public class ComboboxItem 
{ 
    public string Text { get; set; } 
    public object Value { get; set; } 

    public override string ToString() 
    { 
    return Text; 
    } 
} 

public class ColorContainer 
{ 
    public string boxStart { get; set; } 
    public string boxEnd { get; set; } 
    public string borderStart { get; set; } 
    public string borderEnd { get; set; } 
    public string firstEntry { get; set; } 
    public string secondEntry { get; set; } 
} 

如何设置的颜色?或者我在哪里定义它们并更新它们? 第二个问题:在那之后,我怎样才能选择一个值,然后从第三个结构中添加另一个信息?

感谢您在advande

回答

1

类型GradientStop.Color是Color非常多,所以你需要定义ColorContainer.boxStart颜色,或者你需要一个Converter到字符串转换成颜色,但要保持它的简单,我不会使用Converter,因为这会增加代码的复杂性。

public class ColorContainer 
{ 
    public Color boxStart { get; set; } 
    public Color boxEnd { get; set; } 
} 

而且我将ColorContainer属性添加到ComboboxItem

public class ComboboxItem 
{ 
    public string Name { get; set; } 
    public object URL { get; set; } 
    public ColorContainer CContainer { get; set; } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

而且我定义了一个MyDataContext类包含ComboboxItem是清单的结合

public class MyDataContext 
{ 
    public MyDataContext() 
    { 
     ColorContainer _cContainer = new ColorContainer(); ; 
     _cContainer.boxStart = Colors.Orange; 
     _cContainer.boxEnd = Colors.Green; 

     //note that all items use this _cContainer instance 
     _items = new ObservableCollection<ComboboxItem>(); 
     _items.Add(new ComboboxItem() { Name = "name1", URL = "url1", CContainer = _cContainer }); 
     _items.Add(new ComboboxItem() { Name = "name2", URL = "url2", CContainer = _cContainer }); 
    } 

    ObservableCollection<ComboboxItem> _items; 
    public ObservableCollection<ComboboxItem> Items 
    { 
     get { return _items; } 
    } 
} 

最后,绑定代码:

<Border.Background> 
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="{Binding CContainer.boxStart}" Offset="0"/> 
     <GradientStop Color="{Binding CContainer.boxStart}" Offset="0.7"/> 
     <GradientStop Color="{Binding CContainer.boxend}" Offset="1.0"/> 
    </LinearGradientBrush> 
</Border.Background>  

不要忘记设置的DataContext就像你已经做的那样。

// Constructor 
public MainPage() 
{ 
    InitializeComponent(); 

    this.DataContext = new MyDataContext(); 
    // Sample code to localize the ApplicationBar 
    //BuildLocalizedApplicationBar(); 
} 

更新

解决有关ListBoxItem的宽度在您的评论的问题,添加此

<ListBox x:Name="ListBox1" Margin="5" Height="300" HorizontalAlignment="Stretch" ItemsSource="{Binding Items}" > 
    <!--add this--> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <!--end--> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     .... 
+0

感谢你,它的工作!这个绑定仍然让我非常困惑。 – user3079834 2014-09-30 19:54:56

+0

现在它只是用宽度弄虚作假,它全部设置为自动,因此边框具有确切的宽度,“Image”和“TextBlock”使用该宽度。在没有进入'DataTemplate'环境的情况下进行测试时,一切正常。任何想法为什么发生这种情况 – user3079834 2014-09-30 20:01:20

+0

@ user3079834看到我更新的答案。 – kennyzx 2014-10-01 09:57:55