-1

Rectangle Fillプロパティを bool 値 ( )にバインドするFill="{Binding Path=IsSelected, Converter={StaticResource rectangleFillConverter}}"と、null 例外がスローされます。プロパティ (IsSelected) の値が null でないことを確認しました。Converter を Fill プロパティから削除すると、機能します。これが私のコードです:

xaml

<Rectangle Width="{Binding Duration}" Height="20" Tag="{Binding .}" IsEnabled="{Binding Path=IsEnabled}" Fill="{Binding Path=IsSelected, Converter={StaticResource rectangleFillConverter}}" ToolTip="{Binding Path=Shift}" MouseDown="LabelShift_MouseDown"></Rectangle>

コンバータ

public class RectangleControlFillConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            SolidColorBrush brush; 
            bool b= (bool)value;
            if (b)
                brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#5C8FFF"));
            else
                brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#73E34D"));

            return brush;
        }

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

静的リソース

<converters:RectangleControlFillConverter x:Key="rectangleFillConverter"/>

財産

private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set 
            { 
                _isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }

ItemsControl は長方形で、このコンバーターは機能しますConverter={StaticResource timeToPositionConverter}}"

<ItemsControl Name="icSchedule" ItemsSource="{Binding .}" Grid.Row="1" Grid.Column="1">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" Margin="0"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                                <ItemsControl ItemsSource="{Binding Path=icw}" Tag="{Binding .}" Margin="0,10,0,0"><!--Margin="3"Grid.Row="1" Grid.Column="1"  Background="DarkGray" BorderThickness="1" BorderBrush="White"-->
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Canvas IsItemsHost="True" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemContainerStyle>
                                    <Style TargetType="{x:Type ContentPresenter}">
                                        <Setter Property="Canvas.Left" Value="{Binding Path=Start, Converter={StaticResource timeToPositionConverter}}" />
                                        <Setter Property="Canvas.Top" Value="{Binding Path=Index}" />
                                    </Style>
                                </ItemsControl.ItemContainerStyle>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate DataType="TimeLineEntry">
                                        <Border BorderThickness="1" BorderBrush="DarkGray">
                                                <Rectangle Width="{Binding Duration}" Height="20" Tag="{Binding .}" IsEnabled="{Binding Path=IsEnabled}" Fill="{Binding Path=IsSelected, Converter={StaticResource rectangleFillConverter}}" ToolTip="{Binding Path=Shift}" MouseDown="LabelShift_MouseDown"> 

                                             </Rectangle>                                     
                                        </Border>

                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </DataTemplate> 
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

これはオブジェクトが長方形バインディングであるクラスです (icw はそのオブジェクトのリストです)

public partial class ScheduleItem
    {
        public string Shift 
        { 
            get
            {
                //string s = ((DateTime)DateFrom).ToString("dd.MM.yyyy") + " " + ((TimeSpan)TimeFrom).ToString() + " - " + ((DateTime)DateTo).ToString("dd.MM.yyyy") + " " + ((TimeSpan)TimeTo).ToString();
                String s = String.Format("{0}.{1} {2}:{3} - {4}.{5} {6}:{7}", FullDateFrom.Day, FullDateFrom.Month, FullDateFrom.Hour, FullDateFrom.Minute, FullDateTo.Day, FullDateTo.Month, FullDateTo.Hour, FullDateTo.Minute);
                return s;
            }
        }

        private DateTime FullDateFrom
        {
            get
            {
                DateTime dt = ((DateTime)DateFrom).AddHours(((TimeSpan)TimeFrom).Hours).AddMinutes(((TimeSpan)TimeFrom).Minutes);
               return dt;
            }
        }

        private DateTime FullDateTo
        {
            get
            {
                DateTime dt = ((DateTime)DateTo).AddHours(((TimeSpan)TimeTo).Hours).AddMinutes(((TimeSpan)TimeTo).Minutes);
                return dt;
            }
        }

        public string Name { get; set; }
        public DateTime Start { get { return FullDateFrom; } }
        private int index;
        public int Index 
        { 
            get 
            {
                if (CampaignPerson != null)
                    return CampaignPerson.Index;
                else
                    return index;
            }
            set 
            {
                index = value;
            } 
        }
        public int Duration 
        { 
            get 
            { 
                TimeSpan dt = FullDateTo - FullDateFrom;

                return (dt.Days* 92) + (dt.Hours*4); 
            }
        }

        public bool IsEnabled 
        {
            get { return (FullDateFrom > DateTime.Now); }
        }

        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set 
            { 
                _isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }
        #region setters

        partial void OnTimeFromChanged()
        {
            OnPropertyChanged("Duration");
            OnPropertyChanged("Start");
        }

        partial void OnTimeToChanged()
        {
            OnPropertyChanged("Duration");
            OnPropertyChanged("Start");
        }

        partial void OnDateFromChanged()
        {
            OnPropertyChanged("Duration");
            OnPropertyChanged("Start");
        }

        partial void OnDateToChanged()
        {
            OnPropertyChanged("Duration");
            OnPropertyChanged("Start");
        }

        #endregion



    }

ViewModel クラス icShedule は、このクラスのコレクションにバインドされています

public class ScheduleExtension
    {
        public ICollectionView icw {get; set;}

        public ScheduleExtension(CampaignPerson cp)
        {
            campainPerson = cp;
            scheduleItemsList.CollectionChanged += new NotifyCollectionChangedEventHandler(_scheduleItemsList_CollectionChanged);

            icw = CollectionViewSource.GetDefaultView(scheduleItemsList);
            icw.Filter = ScheduleFilter;
        }

        private CampaignPerson _campainPerson;
        public CampaignPerson campainPerson
        {
            get { return _campainPerson; }
            set 
            { 
                _campainPerson = value;
                scheduleItemsList = new ObservableCollection<ScheduleItem>(_campainPerson.ScheduleItem.Where(p=>p.active)); 
            }
        }

        private DateTime _currentDate;
        public DateTime CurrentDate
        {
            get { return _currentDate; }
            set 
            {
                _currentDate = value;
                icw.Refresh();
                //CurrrentScheduleItemsList = new ObservableCollection<ScheduleItem>(scheduleItemsList.Where(p => p.active && ((DateTime)p.DateFrom).Month == CurrentDate.Month && ((DateTime)p.DateFrom).Year == CurrentDate.Year));

                //OnPropertyChanged("CurrentScheduleItemsList");
            }
        }

        public ObservableCollection<ScheduleItem> scheduleItemsList;



        void _scheduleItemsList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {

        }

        private bool ScheduleFilter(object item)
        {
            if (CurrentDate != null)
            {
                ScheduleItem si = item as ScheduleItem;
                return (CurrentDate.Month == ((DateTime)si.DateFrom).Month && CurrentDate.Year == ((DateTime)si.DateFrom).Year);
            }
            return false;
        }
    }
4

3 に答える 3

0

コンバーターを取り外したときにすべて正常に動作したとしても、問題はコンバーターにあるとは思いません。これは私のテストアプリです。

MainWindow.xaml

<Window x:Class="MVVMTests.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:local="clr-namespace:MVVMTests"
    Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}"
>
<Window.Resources>
    <ResourceDictionary>
        <local:RectangleControlFillConverter x:Key="rectangleFillConverter" />
    </ResourceDictionary>
</Window.Resources>

<Window.DataContext>
    <local:MainWindowViewModel />
</Window.DataContext>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <CheckBox Content="toto" IsChecked="{Binding IsSelected}" />
        <Rectangle Fill="{Binding Path=IsSelected, Converter={StaticResource rectangleFillConverter}}" Grid.Row="1" />
    </Grid>
</Window>

ビューモデル

namespace MVVMTests
{
    public class MainWindowViewModel : NotificationObject
    {
        private Boolean isSelected;

        public MainWindowViewModel()
        {
            isSelected = true;
        }

        public Boolean IsSelected
        {
            get { return this.isSelected; }
            set
            {
                this.isSelected = value;
                this.RaisePropertyChanged<Boolean>(() => IsSelected);
            }
        }
    }
}

そしてコンバーター

namespace MVVMTests
{
    [ValueConversion(typeof(Boolean), typeof(SolidColorBrush))]
    public class RectangleControlFillConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            SolidColorBrush brush;
            bool b = (bool)value;
            if (b)
                brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#5C8FFF"));
            else
                brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#73E34D"));

            return brush;
        }

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

この単純なコードを使用すると、コンバーターが問題ではなく (ウィンドウ スイッチの醜い青/醜い緑)、バインディングが正常に機能することがわかります。

それは解決策ではありませんが、問題が別の場所にあることを示しています...

于 2013-09-25T10:07:49.977 に答える
0

長方形のコンバーターは、どのプロパティでも機能しません。

これは私のために働いていますFill="{Binding Path=CurrentColor}"

そしてScheduleItemのこの変更

 private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set 
            { 
                _isSelected = value;
                if(_isSelected)
                    CurrentColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#73E34D"));
                else
                    CurrentColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#5C8FFF"));
                OnPropertyChanged("CurrentColor");
            }
        }

        private SolidColorBrush _currentColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#5C8FFF"));
        public SolidColorBrush CurrentColor
        {
            get { return _currentColor; }
            set { _currentColor = value; }
        }

あなたの時間とあなたの提案をありがとう。

于 2013-09-25T10:39:27.477 に答える