在DataGrid中设置UserControl的属性?

时间:2020-10-28 23:49:49

标签: c# wpf class binding datagrid

我正在开发一个用于播放音频文件的程序,但我的一个DataGrid遇到了一些问题。基本上,它是指允许用户更改(例如,收听,重复和播放音量)

为此,我制作了自己的UserControl,该控件通过XAML中的DataTemplates动态添加。所以首先这里是一些上下文;

SoundFile.cs (公共类)
具有文件相关属性(例如名称,路径,类别和卷)的类。

SoundLibrary.cs (公共静态)
这是一个静态类,用于跟踪ObservableCollection中的所有SoundFiles,这是用于填充我的DataGrid的集合。

SoundControl.cs (UserControl)
这是我的UserControl,它由几个按钮组成,它具有 SoundFile 的属性,这对我如何设置和/或正确访问感到困惑。

这是我的DataGrid的定义方式;

<DataGrid
    x:Name="MyDataGrid"
    Margin="0,0,0,36"
    AlternationCount="2"
    AutoGenerateColumns="False"
    IsReadOnly="True"
    ItemsSource="{Binding}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Header="Name" />
        <DataGridTemplateColumn Header="Listen Volume">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Slider
                        Margin="5"
                        Maximum="100"
                        Minimum="0"
                        Value="{Binding DataContext.ListenVolume, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Settings">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <local:SoundControl x:Name="SoundController" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Progress">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ProgressBar
                        Maximum="100"
                        Minimum="0"
                        Visibility="Visible"
                        Value="50" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

这是我将其绑定到后面的代码中的方式;

MyDataGrid.ItemsSource = SoundLibrary.Library;

for (int i = 0; i < MyDataGrid.Items.Count; i++)
{
    SoundFile sf = (SoundFile)MyDataGrid.Items.GetItemAt(i);
    Debug.WriteLine(sf.FilePath);
}

这样做可以按预期访问SoundFile,但是我不确定如何通过 SoundControl 访问SoundFile。

SoundControl类非常简单;

public partial class SoundControl : UserControl
{
    public SoundFile Sound { get; set; } = new SoundFile();

    public SoundControl()
    {
        InitializeComponent();

        ListenButton.IsToggled = Sound.Listen;
        RepeatButton.IsToggled = Sound.Repeat;
    }

    private void GridButton_MouseUp(object sender, MouseButtonEventArgs e)
    {
        if (sender == ListenButton)
        {
            Sound.Listen = ListenButton.IsToggled;
            MainWindow mainWindow = (MainWindow)Window.GetWindow(this);
            mainWindow.UnsavedChanges = true;
        }

        if (sender == RepeatButton)
        {
            Sound.Repeat = RepeatButton.IsToggled;
            MainWindow mainWindow = (MainWindow)Window.GetWindow(this);
            mainWindow.UnsavedChanges = true;
        }

        if (sender == FolderButton)
        {
            Debug.WriteLine(Sound.FilePath);
            //Sound.OpenDirectory();
        }
    }
}

任何朝着正确方向的指针将不胜感激,但对于数据绑定和使用DataGrids还是相对较新的……预先感谢!

1 个答案:

答案 0 :(得分:1)

SoundControl的Sound属性应为可绑定属性,即依赖项属性:

public static readonly DependencyProperty SoundProperty =
    DependencyProperty.Register(
        nameof(Sound), typeof(SoundFile), typeof(SoundControl));

public SoundFile Sound
{
    get { return (SoundFile)GetValue(SoundProperty); }
    set { SetValue(SoundProperty, value); }
}

您将像这样将其绑定到DataGrid行的当前SoundFile项:

<DataGridTemplateColumn Header="Settings">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <local:SoundControl Sound="{Binding}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>