簡體   English   中英

WPF-外部更改時,datagrid中的值無法更新轉換器

[英]WPF - Value inside datagrid fails to update converter when changed externally

事實證明,很難從ObservableCollection內的項目中冒出屬性更改的難度-默認情況下,它僅在修改集合本身時才引發更改的事件,而不會引發其中的項目。

這樣的回答(針對我在這個問題上的另一個問題)表明,解決問題的一種方法是使用轉換器:

WPF MVVM-Datagrid不會更新子項的更改屬性

對於我的一種情況,項目的樣式取決於其值,並且可以通過用戶編輯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>

和轉換器:

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();
    }
}

順帶一提,我很驚訝進入Converter的值竟然是Booking-那是綁定的內容,而不是* column-我期望得到Status的字符串值。 知道為什么會有用,因為它可能與答案有關。

無論如何,這是更改狀態的按鈕單擊命令:

private void BookCount()
{
    SelectedBooking.Status = "Booking";
    rep.SaveChanges();
    OnPropertyChanged("");
}

SelectedBooking是保存當前所選行的屬性。 我無奈地射擊了一個空的OnPropertyChanged,嘗試更新它。

但是,沒有喜悅-在重新加載View之前,轉換器代碼不會被點擊。 為什么轉換器方法適用於數據網格編輯而不適用於按鈕單擊,我該怎么辦才能使按鈕單擊以可視方式更新狀態列?

您更改Status但綁定整個Booking對象,這意味着它僅在整個對象更改時才觸發,而不是在該對象中的任何屬性更改時才觸發。 綁定Status

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

並更改轉換器以使用您的預訂狀態而不是Booking對象。 如果您需要傳遞多個值,請使用IMultiValueConverterMultiBinding

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM