2009-12-30 62 views
5

Tôi có một lớp tùy chỉnh, "FavoriteColor" có ba thuộc tính, R, GB. Bây giờ tôi muốn vẽ một hình chữ nhật và điền nó với các giá trị R, G và B (sử dụng databinding). Tôi đã thử đoạn mã sau trong xaml của tôi, nhưng cho tôi một lỗi thời gian biên dịch.tính R G B Binding của màu sắc trong WPF

   <Rectangle Width="10" Height="10" Grid.Column="4"> 
        <Rectangle.Fill> 
         <SolidColorBrush> 
          <SolidColorBrush.Color> 
           <Color R="{Binding Path=R}" /> 
           <Color G="{Binding Path=G}" /> 
           <Color B="{Binding Path=B}" /> 
          </SolidColorBrush.Color> 
         </SolidColorBrush> 
        </Rectangle.Fill> 
       </Rectangle> 

Nó nói rằng các thuộc tính R, G và B của lớp Màu không phải là thuộc tính phụ thuộc. Tôi biết rằng bạn có thể ràng buộc dữ liệu chỉ với các thuộc tính phụ thuộc, nhưng trong trường hợp này, làm thế nào để gắn kết R, G và B của tôi với màu tô của hình chữ nhật.

Có cách nào khác ngoài cách khai báo thêm một thuộc tính kiểu màu và sau đó khởi tạo nó khi R, G và B được đặt? Ngoài ra tại sao R, G và B của lớp màu không phải là thuộc tính phụ thuộc?

+0

2009 bài đăng, tôi biết. Tôi tình cờ gặp điều này. Tôi tìm thấy điều này: '' để làm việc (.NET 4.5) trong trường hợp bất kỳ ai hiện tại hoặc trong tương lai là Googling cho điều này. – DerpyNerd

Trả lời

4

Hãy thực hiện việc này bằng MultiBinding và IMultiValueConverter. Đây là một mẫu đầy đủ.

Đầu tiên, xaml cho Window1. Chúng tôi sẽ thiết lập ba thanh trượt và liên kết các giá trị của chúng với thuộc tính Background của Window thông qua SolidColorBrush.

<Window x:Class="WpfApplication16.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:my="clr-namespace:WpfApplication16" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <my:RgbConverter x:Key="RgbConverter" /> 
    </Window.Resources> 
    <Window.Background> 
     <SolidColorBrush> 
      <SolidColorBrush.Color> 
       <MultiBinding Converter="{StaticResource RgbConverter}"> 
        <Binding Path="Value" ElementName="redSlider" /> 
        <Binding Path="Value" ElementName="greenSlider" /> 
        <Binding Path="Value" ElementName="blueSlider" /> 
       </MultiBinding> 
      </SolidColorBrush.Color> 
     </SolidColorBrush> 
    </Window.Background> 
    <StackPanel> 
     <Slider Minimum="0" Maximum="255" x:Name="redSlider" /> 
     <Slider Minimum="0" Maximum="255" x:Name="greenSlider" /> 
     <Slider Minimum="0" Maximum="255" x:Name="blueSlider" /> 
    </StackPanel> 
</Window> 

Tiếp theo, bộ chuyển đổi. Lưu ý rằng tôi không làm bất kỳ kiểm tra lỗi ở đây - bạn thực sự nên kiểm tra xem độ dài của mảng values là 3 và rằng các giá trị cá nhân là byte có giá trị, vv

public class RgbConverter : IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var r = System.Convert.ToByte(values[0]); 
     var g = System.Convert.ToByte(values[1]); 
     var b = System.Convert.ToByte(values[2]); 

     return Color.FromRgb(r, g, b); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Vậy là xong! Không có mã sau khác là cần thiết.

+0

Chà, thật tuyệt. Tôi chỉ biết về IValueComverter. Tôi không biết về IMultiValueConverter. Cảm ơn rất nhiều – sudarsanyes