2013-06-20 55 views
2

我想在WPF中爲聊天Messenger創建一個自定義列表框控件。我使用橢圓顯示在線/離線用戶。橢圓將顯示在左側,並且一些文本位於ListBoxItem的中央。WPF中的自定義列表框

我想根據某些變量將橢圓填充屬性設置爲紅色/綠色。

這是我做了什麼:

<ListBox Name="myList" HorizontalAlignment="Left" Height="232" Margin="117,74,0,0" VerticalAlignment="Top" Width="207"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <DockPanel> 
         <Ellipse Name="ellipse" Fill="Red" DockPanel.Dock="Left"> 
          <Ellipse.Triggers> 
           <Trigger Property="{Binding Online}" Value="True"> 
            <Setter TargetName="ellipse" Property="Ellipse.Fill" Value="Green"/> 
           </Trigger> 
          </Ellipse.Triggers> 
         </Ellipse> 
         <TextBlock Text="{Binding text}"></TextBlock> 
        </DockPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate>    
     </ListBox> 

,並在代碼:

myList.Items.Add(new { text="Hello",Online="True" }); 

我得到一個錯誤

Cannot find the static member 'FillProperty' on the type 'ContentPresenter'.

我在做什麼錯這裏?

回答

2

你實際上是用其中一些問題誤導WPF。

  1. 綁定觸發器的屬性不起作用。你必須使用觸發器的DataTrigger。
  2. 爲任何控件隨時實施觸發。大部分時間都不起作用。所以去樣式。
  3. 當您在模板中創建Ellipse時,請確保您已爲其創建足夠的大小。這對用戶來說是可見的。

試試這個。

<Window.Resources> 
    <Style x:Key="elstyle" TargetType="Ellipse"> 
     <Setter Property="Height" Value="5"/> 
     <Setter Property="Width" Value="5"/> 
     <Setter Property="Fill" Value="Red"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Online}" Value="true"> 
       <Setter Property="Fill" Value="Green"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</Window.Resources> 
<Grid> 
    <ListBox x:Name="myList" HorizontalAlignment="Left" Height="232" Margin="117,74,0,0" VerticalAlignment="Top" Width="207"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <DockPanel> 
        <Ellipse Name="ellipse" Margin="5" DockPanel.Dock="Left" Style="{DynamicResource elstyle}"> 
        </Ellipse> 
        <TextBlock Text="{Binding Name}"></TextBlock> 
       </DockPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

後面的代碼。

public MainWindow() 
     { 
      Random r = new Random(); 
      InitializeComponent(); 
      for (int i = 0; i < 10; i++) 
      { 
       myList.Items.Add(new { Name = "Name" + i.ToString(), Online = Convert.ToBoolean(r.Next(-1, 1)) }); 
      } 
     } 
3

顯然,這是錯誤的:Property="{Binding Online}"(閱讀文件?)

而且你應該使用Style爲觸發,無需設置TargetName,你需要採取precedence考慮,並使用了一個Setter默認值。

0

出現在您的XAML有幾個問題

  • 設置你的Ellipse
  • 你需要使用Style,而不是Ellipse.Triggers
  • 設置你的Fill大小顏色在你的Style如果你在一些條件下能夠改變它在XAML

這裏的工作示例您的問題

  <DataTemplate> 

       <!--<DockPanel> juste because i like StackPanel--> 
        <StackPanel Orientation="Horizontal"> 

        <!--<Ellipse Name="ellipse" Fill="Red" DockPanel.Dock="Left">--> 
        <Ellipse Name="ellipse" Width="15" Height="15"> 

         <!--<Ellipse.Triggers>--> 
         <Ellipse.Style> 
          <Style TargetType="Ellipse">  

           <Setter Property="Fill" Value="Red"/> 

           <Style.Triggers> 

            <!--<Trigger Property="{Binding Online}" Value="True">--> 
            <DataTrigger Binding="{Binding Online}" Value="True"> 
             <Setter Property="Fill" Value="LimeGreen"/> 
            </DataTrigger> 

           </Style.Triggers> 

          </Style> 
         </Ellipse.Style> 

        </Ellipse> 
        <TextBlock Text="{Binding text}"/> 

       </StackPanel> 
      </DataTemplate>