gpt4 book ai didi

c# - 使用多重绑定(bind)更新源

转载 作者:行者123 更新时间:2023-11-30 22:24:42 24 4
gpt4 key购买 nike

我有一个组合框,即可编辑。我的应用程序中的组合框就像所有数据网格单元格的编辑控件,即编辑组合框中的值应该更新我的数据网格模板列的绑定(bind)。如果是正常绑定(bind),下面的代码会更新源。如果它是多重绑定(bind),它会调用 convertback() 函数。我正在使用下面的转换器来更新我的源代码。 ParentID 属性设置为一种方式。我只需要更新 ID 属性。请帮助我转换回函数

Xaml

<tk:Datagrid>
<tk:DataGridTemplateColumn Header="Event ID" MinWidth="100" CellTemplate="{StaticResource ClipsEventIDCellTemplate}" CellEditingTemplate="{StaticResource ClipsEventIDCellEditingTemplate}" />
</tk:Datagrid>

<DataTemplate x:Key="ClipsEventIDCellTemplate">
<TextBlock>
<TextBlock.Text>
<MultiBinding UpdateSourceTrigger="Explicit" Converter="{StaticResource EventIDConvert}" Mode="TwoWay" UpdateSourceTrigger="Explicit" >
<Binding Path="ParentID" Mode="OneWay"/>
<Binding Path="ID" Mode="TwoWay"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>

<ComboBox x:Name="UniversalTextBox" IsEditable="True" ItemsSource="{Binding UniversalTextEntries, ElementName=TheMainWindow, Mode=OneWay}" KeyDown="OnUniversalTextKeyDown"/>

代码

    // properties
public int ID
{
get { return m_id; }
set
{
if (m_id != value)
{
m_id = value;
NotifyPropertyChanged("ID");
}
}
}

public int ParentID
{
get;
set;
}

private void OnUniversalTextKeyDown(object sender, KeyEventArgs e)
{
if (e.Key != Key.Enter && e.Key != Key.Escape)
return;

var comboBox = sender as ComboBox;
if (comboBox == null)
return;
BindingExpression binding = null;
MultiBindingExpression multibinding = null;

bool restoreGridFocus = false;
bool isMultibinding = false;

binding = comboBox.GetBindingExpression(ComboBox.TextProperty);
if (binding == null)
{
isMultibinding = true;
multibinding = BindingOperations.GetMultiBindingExpression(comboBox, ComboBox.TextProperty);
if (multibinding == null && multibinding.BindingExpressions.Count < 0)
return;
}

if (e.Key == Key.Escape)
{
restoreGridFocus = true;
if (!isMultibinding)
binding.UpdateTarget();
else
multibinding.UpdateTarget();
}
else if (e.Key == Key.Enter)
{
PopulateTextEntries(comboBox.Text);
restoreGridFocus = true;
if (!isMultibinding)
binding.UpdateSource();
else
multibinding.UpdateSource();
}

if (restoreGridFocus)// set the focus back to the lastfocuced cell in the datagrid
{
e.Handled = true;

if (m_BoundDataGrid != null)
{
var cell = m_BoundDataGridCell;

if (cell == null)
cell = DataGridUtils.GetCell(m_BoundDataGrid, m_BoundObject, m_BoundColumnIndex);

if (cell != null)
cell.Focus();
}
}


}

转换器

public class EventIDConverter : IMultiValueConverter
{
#region IMultiValueConverter Members

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 2)
return null;


return string.Format("{0}{1}", values[0], values[1]);
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
if (value == null)
return null;

//ToDo

???????????????
}

#endregion
}

最佳答案

创建一个继承自 IMultiValueConverter 的转换器。

Convert 方法而不是 StringFormat 获取 TextBlock.Text 的值并实现 ConvertBack设置源。

public class EventIDConverter : IMultiValueConverter
{
#region IMultiValueConverter Members

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 2)
return null;


return string.Format("{0} {1}", values[0], values[1]);
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
if (value == null)
return null;

string[] splitValues = ((string)value).Split(' ');
return splitValues;
}

#endregion
}

注意:

  1. 我用空格分隔两个值。这是针对 ConvertBack 中的 split 方法。

  2. 您将其中一个绑定(bind)设置为 OneWay

关于c# - 使用多重绑定(bind)更新源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12665439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com