Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对单元格单击上的DataGrid排序后的WPF多个转换器调用_C#_Wpf_Datagrid - Fatal编程技术网

C# 对单元格单击上的DataGrid排序后的WPF多个转换器调用

C# 对单元格单击上的DataGrid排序后的WPF多个转换器调用,c#,wpf,datagrid,C#,Wpf,Datagrid,我的DataGrid上有一个BackgroundColor转换器,称为每个单元格一次: Converter Called: Ana , 25 Converter Called: Ana , 25 Converter Called: Dan , 5 Converter Called: Dan , 5 Converter Called: Mike , 65 Converter Called: Mike , 65 DataGrid在每个单元格上都有Click事件,用于更新其中一个单元格值(“仅用于测

我的DataGrid上有一个BackgroundColor转换器,称为每个单元格一次:

Converter Called: Ana , 25
Converter Called: Ana , 25
Converter Called: Dan , 5
Converter Called: Dan , 5
Converter Called: Mike , 65
Converter Called: Mike , 65
DataGrid在每个单元格上都有Click事件,用于更新其中一个单元格值(“仅用于测试”)。Converter将在每次单击单元格时触发3次,但只要我通过单击名称标题对网格行进行排序,它将触发多次,排序后将创建类似的重复单元格:

 Age Incremented
Converter Called: Dan , 10
Converter Called: Dan , 10
Converter Called: Dan , 10
Converter Called: Dan , 10
Converter Called: Dan , 10
Converter Called: Dan , 10
Converter Called: Dan , 10


<Window.Resources>
    <local:SimpleBrushColorConverter x:Key="SimpleColorConverter" />
</Window.Resources>
<Grid>
    <DataGrid ItemsSource="{Binding People}" SelectionUnit="CellOrRowHeader" AutoGenerateColumns="False" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Name" IsReadOnly="True" SortMemberPath="Age">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Name="Name" Text="{Binding Path=Name, Mode=TwoWay}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Age" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Name="Age" Text="{Binding Path=Age, Mode=TwoWay}" Background="{Binding Path=Age, Converter={ StaticResource SimpleColorConverter}}" MouseLeftButtonDown="OnCellMouseLeftButtonDown"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</Window>


public partial class MainWindow : Window
{
    PeopleViewModel vm = new PeopleViewModel();
    public MainWindow()
    {
        InitializeComponent();

        DataContext = vm;
    }

    private void OnCellMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Debug.WriteLine("");
        Debug.WriteLine("Age Incremented");
        vm.People.First().Age++;
    }
}

public class SimpleBrushColorConverter : IValueConverter
{
    public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine("Simple Converter Called: " + values + " , " + values);
        if ((int)values < 18) return new SolidColorBrush(Color.FromRgb(250, 0, 0));
        if (60 > (int)values && (int)values > 18) return new SolidColorBrush(Color.FromRgb(0, 250, 0));
        return new SolidColorBrush(Color.FromRgb(0, 0, 250));
    }

    public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

public class PeopleViewModel
{
    public ObservableCollection<Person> People { get; set; }
    public ObservableCollection<Person> People2 { get; set; }

    public PeopleViewModel()
    {
        People = new ObservableCollection<Person>(
            new List<Person>
                {
                    new Person() {Age = 5, Name = "Dan"},
                    new Person() {Age = 25, Name = "Ana"},
                    new Person() {Age = 65, Name = "Mike"}
                }
            );

    }
}

public class NotifyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Person : NotifyPropertyChanged
{
    private string _name;
    private int _age;

    public string Name
    {
        get { return _name; }
        set { _name = value;
        OnPropertyChanged();
        }
    }

    public int Age
    {
        get { return _age; }
        set { _age = value; 
        OnPropertyChanged();
        }
    }
}
年龄增加
他叫:丹,10岁
他叫:丹,10岁
他叫:丹,10岁
他叫:丹,10岁
他叫:丹,10岁
他叫:丹,10岁
他叫:丹,10岁
公共部分类主窗口:窗口
{
PeopleViewModel vm=新PeopleViewModel();
公共主窗口()
{
初始化组件();
DataContext=vm;
}
私有void OnCellMouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
Debug.WriteLine(“”);
Debug.WriteLine(“年龄增加”);
vm.People.First().Age++;
}
}
公共类SimpleBushColorConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
WriteLine(“称为“+values+”,“+values”的简单转换器);
如果((int)值<18)返回新的SolidColorBrush(Color.FromRgb(250,0,0));
如果(60>(int)值和(int)值>18)返回新的SolidColorBrush(Color.FromRgb(0,250,0));
返回新的SolidColorBrush(Color.FromRgb(0,0,250));
}
公共对象转换回(对象值、类型targetTypes、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
公共类PeopleViewModel
{
公共可观察集合人员{get;set;}
公共可观察集合人员2{get;set;}
PublicPeopleViewModel()
{
人员=新的可观察集合(
新名单
{
新人(){Age=5,Name=“Dan”},
新人(){Age=25,Name=“Ana”},
新人(){Age=65,Name=“Mike”}
}
);
}
}
公共类NotifyPropertyChanged:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
公共虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
var handler=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类人员:NotifyPropertyChanged
{
私有字符串\u名称;
私人互联网;
公共字符串名
{
获取{return\u name;}
设置{u name=value;
OnPropertyChanged();
}
}
公共信息
{
获取{return\u age;}
设置{u年龄=值;
OnPropertyChanged();
}
}
}

如果我使用MultiValueConverter并绑定到TextBlock,在排序并单击单元格后的转换器中,我可以看到第一个转换器调用是针对具有“IsVisible=False”旧值的TextBlock的。第二个调用是对真实可见单元的调用。再次排序将为其中一个旧值添加额外的文本块,并带有“IsVisible=False”。这将持续到10个文本块。在某些时候,一些文本块被回收,因此它们不再出现在转换器调用中

将在转换器中使用“IsVisible”来区分有效的文本块,但仍然不确定为什么会发生这种情况

public class MultiBrushColorConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine("Simple Converter Called: " + values[0] + " , " + values[0]);
        var textBlock = values[1];
        if ((int)values[0] < 18) return new SolidColorBrush(Color.FromRgb(250, 0, 0));
        if (60 > (int)values[0] && (int)values[0] > 18) return new SolidColorBrush(Color.FromRgb(0, 250, 0));
        return new SolidColorBrush(Color.FromRgb(0, 0, 250));
    }

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

<DataGridTemplateColumn Header="Age" IsReadOnly="True">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Name="Age" Text="{Binding Path=Age}" MouseLeftButtonDown="OnCellMouseLeftButtonDown">
                <TextBlock.Background>
                    <MultiBinding Converter="{StaticResource MultiColorConverter}">
                        <Binding Path="Age" />
                        <Binding RelativeSource="{RelativeSource Self}" />
                    </MultiBinding>
                </TextBlock.Background>
             </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
公共类MultiBrushColorConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
WriteLine(“称为“+values[0]+”,“+values[0])的简单转换器;
var textBlock=值[1];
如果((int)值[0]<18)返回新的SolidColorBrush(Color.FromRgb(250,0,0));
如果(60>(int)值[0]&(int)值[0]>18)返回新的SolidColorBrush(Color.FromRgb(0,250,0));
返回新的SolidColorBrush(Color.FromRgb(0,0,250));
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}