SelectedIndex 与 OneWayToSource 绑定不会触发

swift

1个回答

写回答

Klethy

2025-06-17 05:15

+ 关注

AI
AI

使用 OneWayToSource 绑定时,SelectedIndex 的更改不会触发绑定源的更新。这种绑定方式通常用于将数据从绑定目标(例如界面控件)传递回绑定源(例如数据模型)。换句话说,一旦将数据从源绑定到目标,目标的更改不会反向传递到源。

案例代码:

假设我们有一个简单的界面,其中包含一个下拉列表框和一个文本框。我们希望将下拉列表框的选定项的索引传递回数据模型,并在文本框中显示该索引。

在 XAML 中,我们首先定义了一个下拉列表框和一个文本框:

<Grid>

<ComboBox x:Name="comboBox" SelectedIndex="{Binding SelectedIndex, Mode=OneWayToSource}" />

<TextBox Text="{Binding SelectedIndex}" />

</Grid>

接下来,我们需要在后台代码中创建一个数据模型,并在其中定义一个 SelectedIndex 属性:

csharp

public class MyModel : INotifyPropertyChanged

{

private int selectedIndex;

public int SelectedIndex

{

get { return selectedIndex; }

set

{

selectedIndex = value;

OnPropertyChanged(nameof(SelectedIndex));

}

}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)

{

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

}

然后,我们需要在页面的代码后台实例化数据模型,并将其设置为页面的数据上下文:

csharp

public MAInPage()

{

InitializeComponent();

MyModel model = new MyModel();

DataContext = model;

}

现在,当用户更改下拉列表框的选定项时,SelectedIndex 属性将更新为所选项的索引。同时,文本框中的文本也会随之更新,显示当前的索引值。

使用 OneWayToSource 绑定时的注意事项:

在使用 OneWayToSource 绑定时,需要注意以下几点:

1. 绑定目标必须提供相应的属性来接收绑定源的值。

2. 绑定源的属性必须具有 Setter 方法,以便能够接收绑定目标的更改。

3. 绑定源的属性必须实现 INotifyPropertyChanged 接口,并在属性更改时触发 PropertyChanged 事件,以便通知绑定目标进行更新。

通过使用 OneWayToSource 绑定,我们可以将数据从绑定目标传递回绑定源。这在某些情况下非常有用,例如在用户更改界面控件的值后,将新的值传递给数据模型进行处理。但需要注意的是,该绑定方式不会自动触发绑定源的更新,需要手动在绑定目标的属性更改时触发更新。

参考代码:

XAML:

XML

<Grid>

<ComboBox x:Name="comboBox" SelectedIndex="{Binding SelectedIndex, Mode=OneWayToSource}" />

<TextBox Text="{Binding SelectedIndex}" />

</Grid>

C#:

csharp

public class MyModel : INotifyPropertyChanged

{

private int selectedIndex;

public int SelectedIndex

{

get { return selectedIndex; }

set

{

selectedIndex = value;

OnPropertyChanged(nameof(SelectedIndex));

}

}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)

{

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

}

public MAInPage()

{

InitializeComponent();

MyModel model = new MyModel();

DataContext = model;

}

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号