簡體   English   中英

在代碼隱藏中修改屬性不會更新 ListBox 的 ItemsTemplate 中的 DataContext 綁定

[英]Modifying property in codebehind doesn't update DataContext binding in ItemsTemplate of ListBox

我做了一個測試項目來證明我的問題。
在主窗口中,我定義了一個ListBox和它的ItemTemplate ,以及 1 個按鈕Update
DataTemplate中,我定義了一個CheckBox ,其中IsChecked綁定到IsUsed屬性。

<Window x:Class="Tests.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    <WrapPanel>
        <ListBox x:Name="listBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding IsUsed}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Content="Update" Click="ButtonUpdate_Click"/>
    </WrapPanel>
</Window>

項目的業務對象:

namespace Tests;

public class Foo
{
    public Foo(bool isUsed) => IsUsed = isUsed;

    public bool IsUsed { get; set; }

    public override string ToString() => IsUsed.ToString();
}

MainWindow 背后的代碼:

using System.Windows;

namespace Tests;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        listBox.ItemsSource = new Foo[]
        {
            new(true),
            new(false),
        };
    }

    private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
    {
        Foo? SelectedItem = (Foo)listBox.SelectedItem;
        if (SelectedItem is not null)
        {
            SelectedItem.IsUsed = false;
        }
    }
}

更新按鈕反轉所選項目的布爾屬性IsUsed

執行程序顯示第一項的復選框被選中,這是應該的。

但是,單擊Update並不會取消選中該復選框,即使它應該取消選中該復選框,因為它將IsUsed屬性設置為false

我想我需要修改綁定來解決問題。

這個問題並不特定於布爾值,我用其他類型進行了測試。

當更改后面的任何屬性時,您需要通知 UI 這個更改以便綁定知道。

 public class Foo : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged implementos
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion

        private bool isUsed;
       
        public Foo(bool isUsed) => IsUsed = isUsed;

        public bool IsUsed { get => isUsed; set { isUsed = value; RaisePropertyChanged(); } }

        public override string ToString() => IsUsed.ToString();
    }

如果您需要通過 UI 進行更改,請將 Checkbox 綁定更改為雙向 :)

  <CheckBox IsChecked="{Binding IsUsed, Mode=TwoWay}"/>

對不起我的英語:/

暫無
暫無

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

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