Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# WPF-外部更改时,datagrid内的值无法更新转换器_C#_Wpf_Xaml_Mvvm_Datagrid - Fatal编程技术网

C# WPF-外部更改时,datagrid内的值无法更新转换器

C# WPF-外部更改时,datagrid内的值无法更新转换器,c#,wpf,xaml,mvvm,datagrid,C#,Wpf,Xaml,Mvvm,Datagrid,事实证明,从ObservableCollection中的项中冒泡出属性更改是非常困难的-默认情况下,它只在集合本身被修改时引发更改的事件,而不是集合中的项 这个答案(对我关于这个主题的另一个问题)表明,解决这个问题的一个方法是使用转换器: public class BookingBackgroundConverter : IValueConverter { public object Convert(object value, Type targetType, object parame

事实证明,从ObservableCollection中的项中冒泡出属性更改是非常困难的-默认情况下,它只在集合本身被修改时引发更改的事件,而不是集合中的项

这个答案(对我关于这个主题的另一个问题)表明,解决这个问题的一个方法是使用转换器:

public class BookingBackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Booking b = (Booking)value;

        switch(b.Status)
        {
            case "Booking" :
                return Brushes.LightBlue;
            case "Booked" :
                return Brushes.LightGreen;
            default :
                return Brushes.Transparent;
        }
    }

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

在我的一个场景中,一个项目的样式取决于它的值,并且该值可以通过用户编辑DataGrid来更改,它工作得非常好

但是,在同一个DataGrid中,可以通过按下按钮来更新另一个字段-按钮位于同一个ViewModel中,但它不属于DataGrid本身。我尝试了一个类似的技巧来实现这一点:

<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Background">
                <Setter.Value>
                    <Binding Converter="{StaticResource BookingBackgroundConverter}" />
                </Setter.Value>
            </Setter>
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>
顺便说一句,我很惊讶进入转换器的值竟然是一个Booking——这是行绑定到的,而不是*列——我希望得到Status的字符串值。了解原因可能会有用,因为这可能与答案有关

无论如何,下面是更改状态的按钮单击命令:

private void BookCount()
{
    SelectedBooking.Status = "Booking";
    rep.SaveChanges();
    OnPropertyChanged("");
}
SelectedBooking是保存当前选定行的属性。我正在发射一个空的OnPropertyChanged,在绝望中试图更新它


但是没有乐趣-在视图重新加载之前,转换器代码不会被命中。为什么转换器方法适用于数据网格编辑,而不适用于按钮单击,我该怎么做才能让按钮单击以直观地更新状态列呢?

您可以更改
状态
,但您可以绑定整个
预订
对象,这意味着它只会在整个对象更改时触发,而不会在该对象中的任何属性更改时触发。改为绑定
状态

<Binding Path=Status, Converter="{StaticResource BookingBackgroundConverter}" />


并将转换器更改为使用您的预订状态,而不是
booking
对象。如果您需要传递多个值,请使用

这实际上不起作用,但是+1告诉我您需要在单个值转换器中指定路径-我认为它会自动推断出这一点。什么不起作用?当
状态
值更改时,是否仍不调用转换器?
Booking
类是否实现了
INotifyPropertyChanged
?否,预订未实现INotifyPropertyChanged。它是一个实体框架类。在其他地方,这并不是问题,因为我已经将INotfiyPropertyChanged添加到ViewModel并通过它公开对象。我不清楚为什么在编辑网格时预订会更新,但不是在按钮上单击编辑意味着值更改,所以它会刷新数据,而按钮单击则不会。若它是EF对象,那个么最好的解决方案就是像在其他地方一样创建视图模型包装器。