2012-01-30 3 views
0

Я пытаюсь сделать ширину столбца в переменной элемента Grid. Для этого у меня есть DependencyProperty «ItemWidth» и привязывайте элемент Width от кнопки к этому DP. Из-за привязки TwoWay мне нужен конвертер, который преобразует удвоения в DataGridLength.Связывание ширины столбцов с DependencyProperty с IValueConverter

Мой MainWindow.xaml выглядит следующим образом:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:utils="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Grid.Resources> 
     <utils:ColumnWidthConverter x:Key="columnWidthConverter"/> 
    </Grid.Resources> 
    <Button Grid.Row="0" Grid.Column="0" Width="{Binding Path=ItemWidth, Mode=TwoWay, Converter={StaticResource columnWidthConverter}}" Click="Shorter_Click">shorter</Button> 
    <Button Grid.Row="0" Grid.Column="1" Width="{Binding Path=ItemWidth, Mode=TwoWay, Converter={StaticResource columnWidthConverter}}" Click="Longer_Click">longer</Button> 
</Grid> 
</Window> 

ColumnWidthConverter.cs выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows; 

namespace WpfApplication1 
{ 
    class ColumnWidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value == null) 
       return null; 
      else 
      { 
       DataGridLengthConverter cv = new DataGridLengthConverter(); 
       object result = cv.ConvertFrom(value); 
       return result; 
      } 

     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value == null) 
       return null; 
      else 
      { 
       DataGridLengthConverter cv = new DataGridLengthConverter(); 
       return cv.ConvertTo(value, typeof(double)); 
      } 
     } 
    } 
} 

И MainWindow.xaml.cs выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public double ItemWidth 
     { 
      get { return (double)GetValue(ItemWidthProperty); } 
      set { SetValue(ItemWidthProperty, value); } 
     } 

     public static readonly DependencyProperty ItemWidthProperty = 
     DependencyProperty.Register("ItemWidth", typeof(double), typeof(MainWindow), new UIPropertyMetadata(0.0)); 

     private void Shorter_Click(object sender, RoutedEventArgs e) 
     { 
      this.ItemWidth -= 100; 
     } 

     private void Longer_Click(object sender, RoutedEventArgs e) 
     { 
      this.ItemWidth += 100; 
     } 
    } 
} 

Таким образом, ширина кнопок будет меняться при нажатии одной из кнопок. Но этого не происходит. Можете ли вы сказать мне, почему это так и какое-то решение?

+0

Привет, ты намеренно написал этот код в функции новообращенного? вернуть новую DataGridLength (100); вы должны использовать этот? результат возврата; –

+0

К сожалению, это было для целей отладки. Его результат не работает с возвратом. – Hauke

+0

Изменяется ItemWidth, но не размер кнопок. – Hauke

ответ

1

Вы не установили источник в привязке, следовательно, он относится к DataContext, который, кажется, нигде не установлен, если вы добавите его, который должен работать. например

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ... 

Вы можете (т.е. вы определенно должны) смотреть в debugging data bindings, если вы не знакомы с ним.

Вы также связываете свойства, которые не нуждаются в конвертере, фактически конвертер, вероятно, вызовет проблемы здесь, не означает ли вы связать ColumnDefinition.Width?

+0

Большое спасибо за эту информацию! К сожалению, настройка DataContext не устранила проблему. – Hauke

+0

@Hauke: Тогда дайте нам некоторые ошибки привязки, если они есть. Кроме того, почему вы привязываете Button.Width? См. Nate i добавил ... –

+0

Это всего лишь пример приложения. На самом деле мне нужно вручную реализовать GridSplitter. Для этого мне нужно изменить ширину. Ошибок привязки нет. Это то, что я не понимаю. По моему мнению, код должен работать нормально. В проекте у компании структура сетки очень сложна, поэтому я должен использовать свойство width элемента кнопки (альтернативно Border). И из-за этого мне нужен конвертер. И никаких других ошибок. – Hauke

1

я использую следующие для моего GridSplitter

public class DoubleToGridLengthConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     double i = (double)value; 

     GridLength result = new GridLength(i); 

     return result; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     GridLength g = (GridLength)value; 

     return (double)g.Value; 

    } 

} 

Xaml

Width="{Binding Source={x:Static Properties:Settings.Default}, Path=GridSplitter, Mode=TwoWay, Converter={StaticResource GridLengthConverter}}" 
Смежные вопросы