c# - 在 XAML 中正确设置绑定(bind)源

标签 c# .net wpf xaml binding

我想要一个文本 block 列表,每个文本 block 旁边都有组合框。 每个 ComboBox 的 ComboBox 数据源应该相同。然而,每个 TextBlock 应包含 List 的后续元素 ComboBox 和 TextBlock 的数据源都在我的“设置”对象中。所以我将整个窗口的DataContext设置为这个设置对象。

这是我的问题: TextBlock 的数据源是:名为 Fields 的列表,它位于“Line”类型的名为“Header”的对象内部(当然位于设置对象内部,即我的数据上下文)。

所以,从图形上看: 设置(类型:设置) - header (类型:CsvLine) - 字段(类型:字符串列表)

现在是组合框。每个ComboBox的数据源应该是一个名为Tags的List

以图形方式: 设置(类型:设置)-标签(类型:字符串列表)

我不知道应该如何指向这些位置,我尝试了很多选项,但都不起作用。我只看到一个空白窗口。

这是我的代码:

<Grid>
    <StackPanel Orientation="Horizontal">
        <ItemsControl ItemsSource="{Binding Headers}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Fields}"/>
                        <ComboBox ItemsSource="{Binding DataContext.Tags,
                            RelativeSource={RelativeSource AncestorType=ItemsControl}}">
                        </ComboBox>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>

我不知道我实际上应该将什么作为 ItemsSource 传递给 ItemsControl,因为我认为它应该是 TextBox 和 ComboBox 的公共(public)源,但它们唯一的公共(public)源是设置对象 - 但我已经将其设置为我的 DataContext。 我在 ComboBox 中使用过relativesource,但我不太确定它的用途(尽管我在 MSDN 上读过一篇关于它的文章)。我不知道为什么,但我真的很难理解绑定(bind) - 我正在努力让任何东西发挥作用。

//编辑: 这是我的设置类 - 这是我的设置对象的类型:

public class Settings
{
    public CsvLine AllHeaders1
    {
        get
        {
            return _allHeaders1;
        }
    }

    public CsvLine _allHeaders1 = new CsvLine()
    {
        Fields = new List<string>()  
        { 
           "Header1" , "Header2" , "Header3" 
        }
    };

    private List<String> _tags;

    public List<String> Tags
    {
        get
        {
            return new List<string>() { "Tag1", "Tag2", "Tag3", "Tag4", "Tag5" };
        }
        set
        {
            _tags = value;
        }
    }

}

这是我的 CsvLine 类:

public class CsvLine
{
    public List<string> Fields = new List<string>();

    public int LineNumber;

}

最佳答案

所以,我不能 100% 确定您想要什么,但以下内容应该可以帮助您开始。

首先,您需要确保绑定(bind)到公共(public)属性 - 而不是公共(public)成员 - 因此 CsvLine.Fields 成员需要更改为 public List<string> Fields { get { return _fields; } set { _fields = value; } } 。另外,如果您希望设置对象中的更改反射(reflect)在 UI 中,则需要实现 INotifyPropertyChanged。

无论如何,完成此操作并将其分配给网格的 DataContext 后,下面将显示文本 block 的垂直列表(显示“标题 1”、“标题 2”、“标题 3”),每个文本 block 都有一个组合框右侧包含值“Tag1”、“Tag2”...“Tag5”。

<Grid x:Name="SourceGrid">
    <ItemsControl ItemsSource="{Binding Path=AllHeaders1.Fields}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" />
                    <ComboBox ItemsSource="{Binding ElementName=SourceGrid, Path=DataContext.Tags}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

希望有帮助。

关于c# - 在 XAML 中正确设置绑定(bind)源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39118665/

相关文章:

c# - Azure应用程序服务可以访问github存储库中的文件吗?

c# - 具有分布式 session 的 ASP.Net Core Identity

c# - 从集合中移除对象

.net - 如何在 WCF 服务中将密码与我的证书 (X.509) 一起发送?

c# - 如何在代码中以编程方式动态更新具有更多行和列的列表框中的网格(C# 和 WPF)

wpf - 为每个字符串生成特定的颜色?

c# - 设置 WPF ImageSource 的透明度(相当于 GDI Matrix33 = 0.5f)?

c# - 如何访问另一个类中的属性?

c# - 从 .Net 调用 Visual FoxPro COM 对象(进程外)时出现 RPC_E_SERVERFAULT?

c# - 反射找不到抽象类属性的私有(private) setter