C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?相关的知识,希望对你有一定的参考价值。

在Window_Loaded时,已经指定了DataContext-----语法如下
Employee emp = new Employee();
grid.DataContext = emp;

然后在XAML中针对各个属性进行了绑定;例如
TextBox x:Name="txtName" Text="Binding Name" //Name是Employee的属性之一;

然后我创建一个Button,我在点击Button时,想把TextBox中的值输入到数据库,还需要再次指定DataContext吗?

    更新了数据库必须手动再刷新到到后台对象

    WPF里面改变了绑定值,界面不会自动刷新,要自动刷新绑定的属性需要实现INotifyPropertyChanged接口,比较复杂,自己去查查

    如果你不会2的接口,试试类似如下的刷新代码

       ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                         .UpdateTarget();

参考技术A 怎么说话语无伦次的,全是一级的号——来自 诺基亚 Lumia 920

C#/WPF:将 Datagrid 中的 Combobox ItemSsource 绑定到 DataContext 之外的元素

【中文标题】C#/WPF:将 Datagrid 中的 Combobox ItemSsource 绑定到 DataContext 之外的元素【英文标题】:C#/WPF: Binding Combobox ItemSource in Datagrid to element outside of the DataContext 【发布时间】:2010-12-02 14:21:24 【问题描述】:

我想做以下事情:

public List<Users> PreLoadedUserList  get; set; 
public List<RowEntries> SomeDataRowList  get; set; 

public class Users

    public int Age  get; set; 
    public string Name  get; set; 

public class SomeDataRowList 

    public int UserAge  get; set;

现在我的(WPF 工具包)DataGrid 看起来像这样:

<my:DataGrid AutoGenerateColumns="False" MinHeight="200" 
             ItemsSource="Binding Path=SomeDataRowList">
    <my:DataGridComboBoxColumn Header="Age" 
                               ItemsSource="Binding Path=PreLoadedUserList" 
                               DisplayMemberPath="Name" 
                               SelectedValueBinding="Binding Path=UserAge"/>

</my:DataGrid>

现在我的问题是,PreLoadedUserList 在 ItemSource (SomeDataRowList) 之外,我不知道如何绑定到它之外的东西。我真正想要的: - 在 ComboBox PreLoadedUserList 中显示 - 将 (RowEntries) SelectedItem.UserAge 的 Value 设置为所选 ComboboxItem.Age 的 Value

如果我的解释太奇怪了,请告诉我:-)

谢谢你, 干杯

【问题讨论】:

【参考方案1】:

如果 RowEntries 是自定义类,只需为其提供对 PreLoadedUserList 的引用。然后,每个实例都有一个指向它的指针,您可以在绑定中使用它。

只是一个建议,像 Users 和 RowEntries 这样的类名表明它们是集合,但您的使用看起来像是项目而不是集合。我会使用单数名称以避免任何混淆。我会做这样的事情

public List<User> PreLoadedUserList  get; set; 
public List<RowEntry> SomeDataRowList  get; set; 

public class User

    public int Age  get; set; 
    public string Name  get; set; 

public class RowEntry 

    public int UserAge  get; set; 
    public List<User> PreLoadedUserList  get; set; 


// at the point where both PreLoadedUserList is instantiated
// and SomeDataRowList is populated
SomeDataRowList.ForEach(row => row.PreLoadedUserList = PreLoadedUserList);

【讨论】:

【参考方案2】:

我们开始:-)

<my:DataGridTemplateColumn Header="SomeHeader">
    <my:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox SelectedValuePath="UserAge" 
                SelectedValue="Binding Age" 
                DisplayMemberPath="Name" 
                ItemsSource="Binding Path=DataContext.PreLoadedUserList, 
                    RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type Window" 
                IsReadOnly="True" Background="White" />
        </DataTemplate>
    </my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>

希望这对其他人也有帮助。

干杯

【讨论】:

这对我帮助很大...谢谢! 哇,我一直在尝试使用“DataGridComboBoxColumn”,但什么也没有……但是然后魔术!你漂亮的例子工作(与模板的东西)谢谢! 这帮助我解决了我的问题,约瑟夫。处理这些标题组合框是我的下一个任务。您的解决方案帮助了我很多,节省了我很多时间。非常感谢。

以上是关于C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?的主要内容,如果未能解决你的问题,请参考以下文章

DataGrid中的WPF绑定到DataContext

WPF中利用控件的DataContext属性为多个TextBox绑定数据

WPF 绑定到父 DataContext

数据绑定使用DataContext作为Binding的Source

C# mvvmlight model数据非自己定义可以绑定吗

绑定到 DataContext 的 WPF 样式 DataTrigger 不起作用