繁体   English   中英

WPF ItemsControl元素DataTrigger在数据更改后不会触发

[英]WPF ItemsControl element DataTrigger doesn`t fire after data changes

我遇到了一个问题:绑定数据更改后,我的datatrigger不会更改颜色。 Datatrigger位于TextBlock上,它是ItemsControl的ElemntTenplate。

我的Xaml:

   <Grid>
    <Grid.RowDefinitions>
        <RowDefinition ></RowDefinition>
        <RowDefinition Height="3*"></RowDefinition>
    </Grid.RowDefinitions>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition ></RowDefinition>
            <RowDefinition ></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding TaresToReturn, StringFormat='К возврату: {0}'}"></TextBlock>
        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding TaresReturned, StringFormat='Возвращено: {0}'}"></TextBlock>
    </Grid>


    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible">
        <ItemsControl ItemsSource="{Binding Tares}" Margin="5">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="tareReturnController:p_GetTaresForReturnResult">
                    <Border Width="100" Height="30" Margin="10">
                        <TextBlock x:Name="TextBlock" Text="{Binding barcode}" FontSize="15">
                            <TextBlock.Style>
                                <Style>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsReturned, UpdateSourceTrigger=PropertyChanged}" Value="false">
                                            <Setter Property="TextBlock.Background" Value="Red"/>
                                        </DataTrigger>

                                        <DataTrigger Binding="{Binding IsReturned, UpdateSourceTrigger=PropertyChanged}" Value="true">
                                            <Setter Property="TextBlock.Background" Value="Green"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </Border>
                    <!--<DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsReturned}" Value="false">
                        <Setter TargetName="TextBlock" Property="TextBlock.Background" Value="Red"/>
                    </DataTrigger>

                    <DataTrigger Binding="{Binding IsReturned}" Value="true">
                        <Setter TargetName="TextBlock" Property="TextBlock.Background" Value="Green"/>
                    </DataTrigger>
                </DataTemplate.Triggers>-->
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

</Grid>

我的ViewModel部分:

        private ObservableCollection<p_GetTaresForReturnResult> tares_;

        public ObservableCollection<p_GetTaresForReturnResult> Tares
        { get { return tares_; } set { tares_ = value; } }

        private void GetTares()
        {
            tares_ = new ObservableCollection<p_GetTaresForReturnResult>(Terminal.Dc.p_GetTaresForReturn(DateTime.Parse("05.05.2015")));
        }

        public int TaresToReturn
        { get { return Tares.Count(t => Convert.ToBoolean(t.IsReturned) == false); } }

        public int TaresReturned
        { get { return Tares.Count(t => Convert.ToBoolean(t.IsReturned)); } }

        public void ScannerOnOnBarcodeReceived(string[] _args)
        {
            foreach (string barcode in _args)
            {
                var tt = Tares.FirstOrDefault(t => t.barcode.ToLower().Trim() == barcode.ToLower().Trim());
                if (tt != null)
                {
                    var ttt = new p_GetTaresForReturnResult();
                    ttt.barcode = "111";
                    ttt.id = 111;
                    ttt.IsReturned = false;
                    tares_.Add(ttt);//Add new element for test
                    tt.IsReturned = true;
                    tt.barcode = "1";
                    RaisePropertyChanged("TaresToReturn");
                    RaisePropertyChanged("TaresReturned");
                    RaisePropertyChanged("barcode");
                    RaisePropertyChanged("IsReturned");
                    RaisePropertyChanged("Tares");
                }
            }
        }

p_GetTaresForReturnResult的代码

    public partial class p_GetTaresForReturnResult
{

    private int _id;

    private string _barcode;

    private System.Nullable<bool> _IsReturned;

    public p_GetTaresForReturnResult()
    {
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_id", DbType="Int NOT NULL")]
    public int id
    {
        get
        {
            return this._id;
        }
        set
        {
            if ((this._id != value))
            {
                this._id = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_barcode", DbType="NChar(20)")]
    public string barcode
    {
        get
        {
            return this._barcode;
        }
        set
        {
            if ((this._barcode != value))
            {
                this._barcode = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_IsReturned", DbType="Bit")]
    public System.Nullable<bool> IsReturned
    {
        get
        {
            return this._IsReturned;
        }
        set
        {
            if ((this._IsReturned != value))
            {
                this._IsReturned = value;
            }
        }
    }
}

首次加载页面时,我的元素被正确着色。 当我更改集合并致电RaisePropertyCahnged时,它们不会更改颜色! 注意:如果我将新元素添加到集合中,它将出现在WrapPanel中。 但是已经创建的项目不会更改其颜色和文本!

谁能告诉我我做错了什么?

如果要顺利处理此问题,我认为您必须使用NotificatonObject封装此类,该NotificatonObject包含p_GetTaresForReturnResult字段并p_GetTaresForReturnResult写入/读取属性,但它RaisePropertyChanged在setter中调用RaisePropertyChanged

否则,您需要替换有关更改的项目以通知视图。

Messenger编辑:我修改了p_GetTaresForReturnResult类:

       public partial class p_GetTaresForReturnResult : INotifyPropertyChanged
    {

              ...

        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_IsReturned", DbType="Bit")]
        public System.Nullable<bool> IsReturned
        {
            get
            {
                return this._IsReturned;
            }
            set
            {
                if ((this._IsReturned != value))
                {
                    this._IsReturned = value;
                    NotifyPropertyChanged("IsReturned");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM